C++ 公有方法返回vector与私有vector不是同一个
黄舟
黄舟 2017-04-17 15:29:27
0
3
845
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(3)
巴扎黑

返回vector的值当然不是同一个地址了,返回的是已经拷贝过了的。
可以返回指针,const指针。

左手右手慢动作

返回的值,当然是经过拷贝的啦,你不信的话可以改变一下GetcomputerFishes的返回值,然看看看this->computerFishes的数据是否一致

Peter_Zhu

为什么地址不一样?

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();
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal