類定義中,如果未提供自己的拷貝建構函式,則
c++提供乙個預設拷貝建構函式,就像沒有提供建構函式時,
c++提供預設建構函式一樣。
c++提供的預設拷貝建構函式工作的方法是:完成乙個成員乙個成員的拷貝,如果成員是類物件,則呼叫其拷貝建構函式或者預設拷貝建構函式。
而拷貝建構函式和賦值運算子則是
c++獨有的,也是很多人所不熟悉的地方。建構函式和拷貝建構函式用於從乙個物件複製出另乙個物件。系統提供的預設拷貝建構函式和賦值運算的工作方式是記憶體拷貝,也就是淺拷貝。如果物件中用到了需要手動釋放的物件,則會出現問題,這時就要手動過載這兩個函式,實現深拷貝。
考慮如下情況:
#include >
#include >
struct node
~node()
int * p;
};int main()
什麼時候呼叫拷貝建構函式、什麼時候呼叫賦值函式(=號操作符)
1. a a2(a1);
這個很明顯呼叫的是拷貝建構函式
2. a3 = a2
這個很明顯呼叫的是賦值運算
3. a a3 = a1;
這個就沒其它幾個那麼好懂了,看起來即像是呼叫拷貝建構函式建立乙個物件,又像是呼叫賦值運算複製乙個物件,還是兩個都調了?
實際上,這個呼叫的是拷貝建構函式,和第二行的方式是等價的。
對於第三行的
a a3 = a1;
這種方式,我們如何去理解它呢?實際上有乙個很好記的統一的大原則:
從無到有是呼叫建構函式,從有到有呼叫的是賦值運算
。基於這個原則,前面四行**哪個是呼叫哪個函式就很好區分了。
拷貝建構函式和賦值構造函式呼叫次序
class cprintelement cprintelement cprintelement const cprintelement temp cprintelement cprintelement operator const cprintelement temp int main cprint...
C 建構函式例項 拷貝構造,賦值
define crt secure no warnings windows系統 include include include using namespace std class student student operator const student s student const stude...
C 賦值函式與拷貝建構函式
一看到 操作符,認為必然呼叫賦值函式,然而在下面的例子中,語句a b c顯示的是呼叫拷貝建構函式。結論 在看到 操作符為物件賦值的時候,如果是在物件的定義時候出現則呼叫拷貝建構函式,如果是不是,例子中的b d,則為賦值函式。include using namespace std class a a ...