C 中拷貝建構函式的呼叫與C 返回值優化

2021-08-01 07:42:32 字數 956 閱讀 9357

class dog

dog(const dog &dog)

buf = (int *)malloc(10 * sizeof(int));

std::cout

<<"address of buf is"

}};

如下**所示,在main函式中呼叫****(dog)方法的時候,會進行dog物件的複製,在****(dog) 的函式棧中,會建立乙個dog物件的拷貝。如果dog類沒有提供拷貝建構函式,編譯器會提供乙個預設的拷貝建構函式,即淺拷貝

void ****(dog dog)

int main(int argc, char *argv)

淺拷貝會將指定物件的成員變數複製到目標物件,物件當中的指標成員變數也是。這會造成乙個問題,如果淺拷貝完成後釋放指定物件的指標成員變數指向的堆記憶體區域,目標物件對此並不知情,如果它對這塊記憶體進行操作,就會引發異常。

與淺拷貝對應的是深拷貝,除了將指定物件的成員變數複製到目標物件,同時為目標物件的指標變數分配記憶體,並進行複製。當執行上述**時,由於指定了拷貝建構函式,所以在執行****(d)方法的同時也為****(d)棧區域中的dog.buf分配了一段新記憶體。可以看到兩個物件的buf指標變數指向不同的記憶體位址。

default constructor invoked

address of new buf is0x4018ef

copy constructor invoked

address of buf is0x397ac8

另外一種拷貝建構函式的呼叫時機是當宣告乙個類的物件並賦值時,如下所示

int main(int argc, char *argv)

C 拷貝建構函式的呼叫

晚上做c 作業,碰到乙個拷貝函式的問題,看了會書也沒太看明白,回到寢室馬上試驗了下才差不多弄清楚了拷貝建構函式及臨時物件的呼叫。拷貝建構函式主要在以下三種情況下起初始化作用 1.在宣告語句中用乙個物件初始化另乙個物件 2.將乙個物件作為引數按值呼叫方式傳遞給另乙個物件時生成物件副本 3.生成乙個臨時...

C 拷貝建構函式的呼叫

拷貝建構函式主要在以下三種情況下起初始化作用 1.在宣告語句中用乙個物件初始化另乙個物件 2.將乙個物件作為引數按值呼叫方式傳遞給另乙個物件時生成物件副本 3.生成乙個臨時物件作為函式的返回結果。這種情況只有在windwos下是真的,我只是在windos xp vc 6.0 以下面的 為例 incl...

C 中拷貝建構函式

拷貝建構函式主要需要考慮兩個問題 乙個是什麼時候會呼叫拷貝建構函式,另乙個是拷貝建構函式中的淺拷貝和深拷貝 問題1 1 物件在建立時使用其他的物件初始化 cstudent b a 此時複製建構函式被用來建立例項b cstudent c a 此時複製建構函式被用來在定義例項p時初始化c 2 物件作為函...