返回物件1(未呼叫拷貝建構函式)

2021-10-12 03:15:04 字數 1458 閱讀 6094

物件作為返回值與物件作為引數處理方法非常類似,物件作為引數時,進入函式前預先將物件使用的棧空間保留出來,並將實參物件中的資料複製到棧空間保留出來,並將實參物件中的資料複製到棧空間中。該棧空間作為函式引數,用於函式內部使用。同理物件作為返回值時,進入函式後將申請返回物件使用的棧空間,在退出函式時,將返回物件中的資料複製到臨時的棧空間中,以這個臨時棧空間的首位址作為返回值。

這裡我主要把那個返回物件 臨時物件 物件obja圈了起來,因為這裡有個賦值(拷貝)流程(這裡的拷貝並未呼叫到拷貝建構函式,這裡拷貝的意思是彙編層面的拷貝)詳情的話可以私下了解一下彙編**,然後看起來會受益匪淺,首先

返回物件---->臨時物件

臨時物件----->物件obja

在getcreturn中,有個區域性物件,區域性物件拷貝(依然是彙編層面的拷貝)到返回物件中,

這裡大家會不會在想,直接把區域性物件拷貝給臨時物件不就得了嘛?為什麼還得區域性物件到返回物件,返回物件到臨時物件。這裡按照我的理解是:

因為傳過來的返回物件的位址和區域性物件的位址是不一樣的,返回物件拷貝到臨時物件這個操作是在

call完getcreturn函式後進行拷貝(由位址4012ba以下可知),此時才能有效開闢臨時空間(因為在getcreturn內開闢臨時空間,函式結束後,空間也就沒了,相當於開闢了個寂寞),所以在函式內部根本不可能找到乙個臨時空間來用,只能到先傳遞給返回物件,讓返回物件在函式外來找乙個臨時空間進行拷貝,照這裡的操作,感覺這個返回物件的生命週期應該會比函式內的區域性物件生命週期長那麼一點點

接上上面的流程就是

區域性物件---->返回物件

返回物件---->臨時物件

臨時物件----->物件obja

(疑問點:返回物件的空間是在main函式裡開闢(結合位址401293以及位址4012ae可看出)的,生命週期相比區域性物件更長,為什麼要使用區域性物件來賦值?直接用返回物件來賦值,不是更簡便嗎?還可以省了一次拷貝)

但是我感覺這個返回物件的生命週期挺長的呀

物件導向的程式設計 拷貝建構函式(1)

物件導向的程式設計 拷貝建構函式 1 拷貝建構函式是c 最基礎的概念之一,大家自認為對拷貝建構函式了解麼?請大家先回答一下三個問題 1.以下函式哪個是拷貝建構函式,為什麼?x x const x x x x x x x int a 1 x x x int a 1,b 2 2.乙個類中可以存在多於乙個...

拷貝建構函式和賦值構造函式呼叫次序

class cprintelement cprintelement cprintelement const cprintelement temp cprintelement cprintelement operator const cprintelement temp int main cprint...

呼叫C 複製建構函式和拷貝建構函式

呼叫c 複製建構函式和拷貝建構函式 1.何時呼叫複製建構函式 複製建構函式用於將乙個物件複製到新建立的物件中。也就是說,它用於初始化過程中,而不是常規的賦值過程中。類的複製建構函式原型通常如下 class name const class name 它接受乙個指向類物件的常量引用作為引數。例如,st...