題目 C 拷貝建構函式與C 臨時物件

2021-06-20 02:23:52 字數 2180 閱讀 5034

一、拷貝建構函式

1、拷貝建構函式定義

; a(const a&); //定義拷貝建構函式,一定要有乙個實現

};a::a(const a& aa)

//呼叫這個函式的時候,先會呼叫拷貝建構函式

//e3、函式返回乙個物件

a get() //

二、c++淺拷貝和深拷貝

1、淺拷貝

class a

; a(const a&);

void setdata(int a1)

void output()

//賦值操作符過載

cexample & cexample::operator = (const cexample& rightsides)

【點評】深拷貝,會將物件指標指向的動態記憶體中的值,拷貝到另外乙個物件中,以防止記憶體洩露。另外,拷貝是將乙個有值的物件賦值給空值的物件,而"賦值"操作符是將原來有值的物件中的值覆蓋,呼叫的是"=過載函式"。

三、拷貝構造函式呼叫時機

1、物件作為引數,呼叫建構函式

//淺拷貝中的例子加入如下**

bool seta(a a)

//void main()

seta(a);

//彙編**

53:       a b = a;

004012ca   lea         eax,[ebp-4] //a的指標

004012cd   push        eax

004012ce   lea         ecx,[ebp-8] //b的指標

004012d1   call        @ilt+60(a::a) (00401041)

54:       b.output();

004012d6   lea         ecx,[ebp-8]

004012d9   call        @ilt+15(a::output) (00401014)

55:       seta(a);

004012de   push        ecx

004012df   mov         ecx,esp //當前棧已經開闢了臨時物件空間,相當於b的指標

004012e1   lea         edx,[ebp-4]

004012e4   push        edx //a的指標

004012e5   call        @ilt+60(a::a) (00401041)

004012ea   call        @ilt+10(seta) (0040100f) //已經拷貝了到了ecx,所以就直接呼叫seta(),此時esp就是臨時物件的指標

004012ef   add         esp,4 //esp+4 還是指向臨時物件

2、返回乙個物件
cexample getexpfun()

objexp2 = getexpfunc();

004013e4   lea         ecx,[ebp-40h]           //返回的臨時物件空間是進入main函式的時候,提前分配好的。

004013e7   push        ecx                     //先將物件壓棧      

004013e8   call        @ilt+25(getexpfun)      //呼叫函式

【點評】 返回物件時,也是在當前棧分配了臨時空間,會呼叫在函式中,呼叫拷貝建構函式,來賦值給臨時空間。相當於乙個中轉戰,先拷貝建構函式賦值給臨時空間,再用它。

參考:1、c++拷貝建構函式(深拷貝、淺拷貝)

2、c++拷貝建構函式和賦值操作

3、02類與物件(5)-拷貝構造

4、拷貝建構函式

5、c++臨時物件的學習筆記

6、拷貝建構函式的呼叫

7、拷貝建構函式與賦值運算子過載

C (一) 建構函式與拷貝建構函式

2.拷貝建構函式 類通過乙個或幾個特殊的成員函式來控制其物件的初始化過程,這些函式叫做建構函式。建構函式的任務是初始化類物件的資料成員。tip 建構函式不能宣告為const的。形式1 person 不帶任何引數,合成的預設建構函式就是該形式 合成預設建構函式初始化規則 1 如果存在類內的初始值,用它...

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...

C 類物件的拷貝建構函式

c 類物件的拷貝建構函式 不祥 閱讀人次 條 對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 100 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。include using namespace std cl...