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