84669인 학습
152542인 학습
20005인 학습
5487인 학습
7821인 학습
359900인 학습
3350인 학습
180660인 학습
48569인 학습
18603인 학습
40936인 학습
1549인 학습
1183인 학습
32909인 학습
人生最曼妙的风景,竟是内心的淡定与从容!
返回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对象的支持。
然后可以用该返回值初始化引用变量(也可以初始化非引用变量,拷贝初始化):
当然也可以通过函数返回值直接访问: