Rumah > Soal Jawab > teks badan
ringa_lee2017-04-17 15:31:27
返回的值,当然是经过拷贝的啦,你不信的话可以改变一下GetcomputerFishes
的返回值,然看看看this->computerFishes
的数据是否一致
天蓬老师2017-04-17 15:31:27
为什么地址不一样?
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();