c++成員函數返回類對象引用和直接返回類對象的區別
成員函數直接返回類對象(返回臨時對象,對象拷貝)
#include <iostream>
class MyInt {
public:int value;//構造函數explicit MyInt(int v=0) : value(v){}//加法操作,返回對象副本(拷貝對象)MyInt add(int x) {value += x;//this 是一個指向當前對象的指針,表示當前對象的存儲地址。//*this 是對 this指針的解引用,表示當前對象本身return *this;}
};int main() {MyInt a(5);//構造函數初始化value//add(2)返回新的對象副本(初始值為5)不是原來的a,所以 .add(3)是對臨時對象的操作a.add(2).add(3);std::cout << a.value << std::endl;return 0;
}
對象成員變量被初始化為5
a.add(2).add(3) 的執行順序是關鍵。以下是詳細解釋:
a.add(2) 的執行:
a.add(2) 調用 add 方法,將 a.value 的值從 5 增加到 7。
add 方法返回的是當前對象的副本(*this),返回類型 函數名稱 MyInt add(),而不是對原對象 a 的引用。
.add(3) 的執行:
.add(3) 是對 a.add(2) 返回的臨時對象的操作,而不是對原對象 a 的操作。
臨時對象的 value 是 7,它被加上 3,但這個副本不會影響原對象 a。
std::cout << a.value:
輸出的是原對象 a 的 value,此時 a.value 仍然是 7,因為 .add(3) 的操作只影響了臨時對象
成員函數返回類對象引用(返回對象引用)
#include <iostream>
class MyInt {
public:int value;//構造函數explicit MyInt(int v=0) : value(v){}//加法操作,返回類型別名(引用),對別名的操作就是對對象本身的操作MyInt& add(int x) {value += x;//this 是一個指向當前對象的指針,表示當前對象的存儲地址。//*this 是對 this指針的解引用,表示當前對象本身(即引用當前對象)//在 C++ 中,this 是一個指向當前對象的指針,而 *this 表示對該指針的解引用,獲取當前對象的引用return *this;//在調用 add 后繼續對同一個對象調用其他方法,實現鏈式調用}
};int main() {MyInt a(5);//構造函數初始化value//add(2)返回a的引用,所以可以繼續 .add(3)a.add(2).add(3); //鏈式調用允許多個操作在一行代碼中連續執行,而無需多次引用對象std::cout << a.value << std::endl;return 0;
}
在代碼中,a.add(2).add(3); 的執行順序是關鍵。
a.add(2):
調用 add 方法,value 的值從 5 增加 2,變為 7。
add 方法返回當前對象的引用(*this),對引用(別名)的操作就是對原對象的操作,因此可以繼續調用鏈式方法。
.add(3):
在 a.add(2) 返回的對象上再次調用 add 方法。
此時,value 的值從 7 增加 3,變為 10。
最終,a.value 的值是 10,因此輸出結果為 10。