是一個特殊的構造函數,通過現有對象創造新對象。
複制構造函數有着特殊的函數原型,很容易識别,一般其有一個所屬類的參數(引用)。
如class a 的普通的構造函數為
a(); 其複制構造函數可以是a(const a& aa);或a(a& aa);
在建立或者初始化一個對象的時候,(從無到有地建立)會調用普通構造函數;在用已有對象建立一個新對象時會調用複制構造函數。
出現下列情況時,将調用複制構造函數:
對象從一個函數按值傳遞至另一個函數時;
對象從函數按值傳回時;
通過現有對象初始化一個新對象時。
如下例:
void f()
{
TInt x(100);//建立一個TInt型的對象
//g()是一個接受TInt值的函數
void g(TInt);
//...
g(x);
}
void g(TInt y)
{
//...
}
當f()函數調用帶參數x的g()函數時,複制構造函數構造了一個x的副本,該副本作為實參提供給g()的形參y。從g()退出時,對象y(該函數的形參)被銷毀,即對象y調用了析構函數。在g()内操作對象y不會影響f()内的對象x(按值傳遞)