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

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

全部回覆(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();
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!