人生最曼妙的风景,竟是内心的淡定与从容!
返回vector的值当然不是同一个地址了,返回的是已经拷贝过了的。可以返回指针,const指针。
返回的值,当然是经过拷贝的啦,你不信的话可以改变一下GetcomputerFishes的返回值,然看看看this->computerFishes的数据是否一致
GetcomputerFishes
this->computerFishes
为什么地址不一样?
GetcomputerFishes函数的返回值类型是vector<ComputerFish *>,即按值返回;同时返回语句内的表达式是computerFishes,所以这里会先拷贝构造一个临时对象,然后再返回这个临时对象(注:由于Copy elision,实际运行时不一定真的会拷贝构造这个临时对象)。即返回的对象不是MyClass的成员变量,而是用这个成员变量拷贝构造的一个临时对象,所以他们的地址不一样。(注:按值返回调用时的表达式类型是右值,用户代码是无法直接取返回值的地址的,即无法&x.GetcomputerFishes()。但可以将其转换成左值,然后取地址。)
vector<ComputerFish *>
computerFishes
&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();
返回vector的值当然不是同一个地址了,返回的是已经拷贝过了的。
可以返回指针,const指针。
返回的值,当然是经过拷贝的啦,你不信的话可以改变一下
GetcomputerFishes
的返回值,然看看看this->computerFishes
的数据是否一致GetcomputerFishes
函数的返回值类型是vector<ComputerFish *>
,即按值返回;同时返回语句内的表达式是computerFishes
,所以这里会先拷贝构造一个临时对象,然后再返回这个临时对象(注:由于Copy elision,实际运行时不一定真的会拷贝构造这个临时对象)。即返回的对象不是MyClass的成员变量,而是用这个成员变量拷贝构造的一个临时对象,所以他们的地址不一样。(注:按值返回调用时的表达式类型是右值,用户代码是无法直接取返回值的地址的,即无法&x.GetcomputerFishes()
。但可以将其转换成左值,然后取地址。)想要该函数返回MyClass的私有成员computerFishes,可以用按引用返回。
这一组函数重载分别提供对const MyClass对象和非const MyClass对象的支持。
然后可以用该返回值初始化引用变量(也可以初始化非引用变量,拷贝初始化):
当然也可以通过函数返回值直接访问: