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物件的支援。
然後可以用該返回值初始化引用變數(也可以初始化非引用變量,拷貝初始化):
當然也可以透過函數回傳值直接存取: