C 返回物件和返回引用

2021-07-24 12:59:21 字數 914 閱讀 3723

最大的區別在於,返回物件的話會在記憶體中根據返回的型別開闢一塊區域,用返回的值對該記憶體進行初始化,如果是返回的物件,利用拷貝構造來初始化這個區域,但是這塊區域並沒有名字,就是說之後使用者沒辦法訪問到這個區域,也成為無名變數,它只能在接下來的**中進行一次性的用途,要不作為引數傳遞,或者將值列印,再之後就會直接銷毀,或者呼叫析構函式。

而返回引用的話,引用的本質是對裸露的位址的二次包裝,它實際返回的還是乙個變數或物件的位址,因此如果返回引用不可以返回區域性變數的,因為函式在返回之後,該變數就銷毀。

以下**是對運算子*進行過載,返回引用和返回物件有不同的結果。

#includeusing namespace std;

class a

//a建構函式

a(a& another)

~a()//a析構函式

void func()

};class b

//b建構函式

~b()//b析構函式

可以看到

a operator*()

中,返回的是a類的物件,之後會呼叫a中的拷貝構造器

a(a& another);

即用*_p的值作為引數,在記憶體中構造乙個新的物件,但它沒有名字,是無名物件,之後執行該無名物件中的func()函式,執行完後,這個一次性的無名物件就會銷毀,即呼叫析構函式。

同時,返回物件的話也不能在後續對它進行左值運算,編譯器通不過而且也毫無意義,因為之後程式設計師是沒法訪問到這個無名變數的

僅此個人觀點,有問題歡迎指正。

C 返回物件和返回引用

我們發現,在c 中,有些成員函式返回的是物件,而有些函式返回的又是引用。返回物件和返回引用的最主要的區別就是函式原型和函式頭。car run const car 返回物件 car run const car 返回引用 返回物件會涉及到生成返回物件的副本。因此,返回物件的時間成本包括了呼叫複製建構函式...

c 返回變數和返回變數引用

int at int at 上面兩個函式,第乙個返回值是int的引用int 第二個返回值是int,二者的區別是什麼呢?我們先用乙個語句 const int a mymay.at 來分別呼叫一次上面兩個函式,然後看組合語言的結果。反彙編結果 1 int at 2 5600bb6830 push ebp...

C 箴言 必須返回物件時別返回引用

一旦程式設計師抓住物件傳值的效率隱憂,很多人就會成為狂熱的聖戰分子,誓要 傳值的罪惡,無論它隱藏多深。他們不屈不撓地追求傳引用的純度,但他們全都犯了乙個致命的錯誤 他們開始傳遞並不存在的物件的引用。這可不是什麼好事。考慮乙個代表有理數的類,包含乙個將兩個有理數相乘的函式 class rational...