一、拷貝建構函式
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...