C 中函式return a A類物件 會生成臨時變數,若A類成員指標指向堆記憶體,那堆會拷過去嗎?

時間 2021-05-07 06:17:45

1樓:我比梅西小一歲

可以把a假設成乙個shared_ptr物件,再結合shared_ptr的原理就能很好的理解怎麼管理類裡的指標。除此之外還會有Return Value Optimization的情況,這種情況就不會生成臨時物件然後返回的時候拷貝。

2樓:Mimosa

這是比較複雜的問題,這個不僅僅要看return語句,還要看函式返回的資料型別定義,更與類定義的建構函式有關。如果函式返回的是個物件,要求類定義中必須有個拷貝型的建構函式。這個建構函式拷貝資料到的記憶體空間,就是接受物件的變數裡的記憶體空間。

class CMyCls

CMyCls( CMyCls &Q)

};CMyCls funcA()

CMyCls funcB()

void MyTest()

上面例子中,函式 funcA和函式 funcB執行結果是一樣的,只是呼叫函式funcA時,對變數Va操作拷貝建構函式時從變數Tmp中拷貝資料,而呼叫函式funcB時,先生成乙個臨時的無名物件,然後對變數Vb操作拷貝建構函式,再從臨時變數中拷貝資料。關鍵要記住:在沒有退出函式funcA或函式funcB時,變數Va和變數Vb的記憶體空間已經合法存在。

(補充:這型別函式的呼叫比較特殊:在呼叫函式funcA()或函式funcB()時,變數Va或變數Vb 的記憶體位址已經作為乙個隱性引數傳入)。

知道上面執行機制後,把成員變數的型別改成指標,如何設計相應的拷貝建構函式,應該不會難吧?

3樓:VizXu

那這裡涉及深拷貝和淺拷貝的問題,如果這個類實現了深拷貝建構函式就是拷貝堆記憶體,如果沒有實現就預設淺拷貝,那麼return之後的物件指標會指向這個記憶體,不會進行拷貝。

所以這裡要特別注意實際場景,如果是需要深拷貝,比方乙個類指向一塊堆記憶體,而這塊記憶體是儲存了這個類本身的一些屬性,那麼就需要深拷貝,相反如果這塊記憶體儲存的是公共屬性那麼淺拷貝更合適。

C 建構函式 父類 成員物件的如何專業地初始化

已登出 不考慮效能的情況下 也有以下問題 1.要求這個成員的型別有可訪問的無參建構函式2.要求這個成員的型別有可訪問的賦值函式 很顯然很多態別並不符合這幾點 正確做法 class Person Person std string name name public void SetName std s...

為什麼 C 中,基類指標可以指向派生類物件?

WangKX 語法就這麼規定這叫多型性,如果往深點說,因為子類物件一般比父類物件大,因此這麼指並沒問題,但反過來不行比如子類指標指向父類物件 馬東啥梅來著 不同型別的指標在記憶體中所佔大小是相同的,區別在於編譯器對於指標的解釋是不同的。乙個指標指向某個類的物件,實際上是指向該物件所佔記憶體的首位址位...

C 中是否允許在函式中定義函式?

暗能量泡泡 C 不能支援直接在函式中定義函式。C 11通過支援Lambda函式 實際上是個匿名class的物件 來實現類似功能。其他方式可以使用函式中定義struct class的方式再定義其靜態成員函式的方式來模擬一樣的效果。 Johnny Wong 可以使用class struct的實現,它們支...