what is it?
拷貝建構函式,是一種特殊的建構函式,它由編譯器
呼叫來完成一些基於同一類的其他物件的構建及初始化。其唯一的引數(物件的引用)是不可變的(const型別)。此函式經常用在函式呼叫時使用者定義型別的值傳遞及返回。拷貝建構函式要呼叫基類的拷貝建構函式和成員函式。如果可以的話,它將用常量方式呼叫,另外,也可以用非常量方式呼叫。
when use it?
在c++中,下面三種物件需要呼叫拷貝建構函式(有時也稱「複製建構函式」):
1) 乙個物件作為函式引數,以
值傳遞
的方式傳入函式體;
2) 乙個物件作為函式返回值,以
值傳遞
的方式從函式返回;
3) 乙個物件用於給另外乙個物件進行
初始化
(常稱為
複製初始化
);如果在前兩種情況不使用拷貝建構函式的時候,就會導致乙個指標指向已經被刪除的記憶體空間。對於第三種情況來說,
初始化和賦值
的不同含義是拷貝構造函式呼叫的原因。
事實上,拷貝建構函式是由普通建構函式和賦值操作符共同實現的。
描述拷貝建構函式和賦值運算子的異同的參考資料有很多。
通常的原則是:①對於凡是包含動態分配成員或包含指標成員的類都應該提供拷貝建構函式;②在提供拷貝建構函式的同時,還應該考慮過載"="賦值操作符號。
拷貝建構函式必須以引用的形式傳遞(引數為引用值)。其原因如下:當乙個物件以傳遞值的方式傳乙個函式的時候,拷貝建構函式自動的被呼叫來生成函式中的物件。如果乙個物件是被傳入自己的拷貝建構函式,它的拷貝建構函式將會被呼叫來拷貝這個物件這樣複製才可以傳入它自己的拷貝建構函式,這會導致無限迴圈直至棧溢位(stack overflow)。除了當物件傳入函式的時候被隱式呼叫以外,拷貝建構函式在物件被函式返回的時候也同樣的被呼叫。
類定義變為:
class cexample
~cexample()
cexample(const cexample&); //拷貝建構函式
cexample& operator = (const cexample&); //賦值符過載
void init(int n)
private:
char *pbuffer; //類的物件中包含指標,指向動態分配的記憶體資源
int nsize;
};//賦值操作符過載
cexample& cexample::operator = (const cexample& rightsides)
nsize=rightsides.nsize;//複製常規成員
char *temp=new char[nsize]; //複製指標指向的內容
memcpy(temp,rightsides.pbuffer,nsize*sizeof(char));
delete pbuffer;//刪除原指標指向內容(將刪除操作放在後面,避免x=x特殊情況下,內容的丟失)
pbuffer=temp;//建立新指向
return *this;
}拷貝建構函式和賦值函式的功能是相同的,為了不造成重複**,拷貝建構函式實現如下:
cexample::cexample(const cexample& rightsides)
C 學習筆記 拷貝建構函式
拷貝建構函式是一種特殊的建構函式 1 它是建構函式,所以函式名是類名 沒有返回值 2 它是特殊的建構函式 引數形式是固定的 class object 拷貝建構函式的含義 以乙個物件為藍本,來構造另乙個物件。object b object a b 稱作 以b為藍本,建立乙個新的物件a。a是b的乙個拷貝...
拷貝建構函式(C 學習筆記 25)
point p2 p1 其作用是,在建立新物件p2時,用已經存在的物件p1去初始化新物件p2,在這個過程中就要呼叫拷貝建構函式。自定義拷貝建構函式 見例 1 類名 類名 const 類名 物件名 普通的建構函式是在物件建立時被呼叫,而拷貝建構函式在以下3中情況下都會被呼叫 1 當用類的乙個物件去初始...
C 學習筆記 C 拷貝建構函式(5)
拷貝建構函式是一種特殊的建構函式,它在建立物件時,是使用同一類中之前建立的物件來初始化新建立的物件。拷貝建構函式通常用於 通過使用另乙個同型別的物件來初始化新建立的物件。複製物件把它作為引數傳遞給函式。複製物件,並從函式返回這個物件。如果類帶有指標變數,並有動態記憶體分配,則它必須有乙個拷貝建構函式...