修改引用返回的向量

时间:2016-04-22 01:22:14

标签: c++

为什么下面的矢量大小为0?

#include <iostream>
#include<vector>
using namespace std;
class A
{

    public:
        vector<int> T;
        const vector<int>& get(){
            return T;
        }
        void print(){
            cout<< " size is "<<T.size();
           // cout<<" \nelements are %d "<<T[0];
        }
};
int main()
{
   cout << "Hello World" << endl; 
   A ob;
   vector<int> temp = ob.get();
   temp.clear();
   temp.push_back(3);
    temp.push_back(5);

   ob.print();
   return 0;
}

3 个答案:

答案 0 :(得分:4)

因为没有发生任何事情。它仍然是空的。

您在temp中复制了该向量,并修改了副本,而不是原始的类成员。您应该使用参考:

 vector<int> &temp = ob.get();

由于您要从get()返回引用,因此必须将其指定给引用。如果你不这样做,那你就只是复制了这个对象。

编辑:此外,更改get()以返回可变引用,而不是const引用。

答案 1 :(得分:3)

您没有修改vector课程内的Aget()会返回一个( const!)引用,然后您将其分配给非引用变量,因此 copy 正在创建vector。然后,您正在修改副本,但打印出原始文件。

你需要这样做:

#include <iostream>
#include <vector>

using namespace std;

class A
{
    public:
        vector<int> T;

        vector<int>& get(){
            return T;
        }

        void print(){
            cout << " size is " << T.size();
           // cout << " \nelements are %d " << T[0];
        }
};

int main()
{
   cout << "Hello World" << endl; 

   A ob;
   vector<int> &temp = ob.get();
   temp.clear();
   temp.push_back(3);
   temp.push_back(5);

   ob.print();
   return 0;
}

答案 2 :(得分:2)

两个问题。

首先,您的A::get()方法返回对其成员的const引用。您不能通过const引用修改向量。

其次,您正在修改temp向量,它只是返回值的副本。