问题描述
问题解答
回答1:返回vector的值当然不是同一个地址了,返回的是已经拷贝过了的。可以返回指针,const指针。
回答2:返回的值,当然是经过拷贝的啦,你不信的话可以改变一下GetcomputerFishes的返回值,然看看看this->computerFishes的数据是否一致
回答3:为什么地址不一样?
GetcomputerFishes函数的返回值类型是vector<ComputerFish *>,即按值返回;同时返回语句内的表达式是computerFishes,所以这里会先拷贝构造一个临时对象,然后再返回这个临时对象(注:由于Copy elision,实际运行时不一定真的会拷贝构造这个临时对象)。即返回的对象不是MyClass的成员变量,而是用这个成员变量拷贝构造的一个临时对象,所以他们的地址不一样。(注:按值返回调用时的表达式类型是右值,用户代码是无法直接取返回值的地址的,即无法&x.GetcomputerFishes()。但可以将其转换成左值,然后取地址。)
如何让GetcomputerFishes返回的对象就是computerFishes?
想要该函数返回MyClass的私有成员computerFishes,可以用按引用返回。
vector<ComputerFish *> &GetcomputerFishes() { return computerFishes; }const vector<ComputerFish *> &GetcomputerFishes() const { return computerFishes; }
这一组函数重载分别提供对const MyClass对象和非const MyClass对象的支持。
然后可以用该返回值初始化引用变量(也可以初始化非引用变量,拷贝初始化):
vector<ComputerFish *> &ref = x.GetcomputerFished();ref.clear();
当然也可以通过函数返回值直接访问:
x.GetcomputerFished().clear();