1.拷貝構造函數的形式
對於類X,如果它的函數形式如下
a) X&
b) const X&
c) volatile X&
d) const volatile X&
且沒有其他參數或其他參數都有默認值,那麼這個函數是拷貝構造函數
X::X(const X&);是拷貝構造函數
X::X(const X&,int val = 10);是拷貝構造函數
2.一個類中可以存在超過一個拷貝構造函數
class X {
public:
X(const X&);
X(X&); // OK
};
編譯器根據實際情況調用const拷貝構造函數或非const的拷貝構造函數
3.默認的拷貝構造函數行為
a)先調用父類的拷貝構造函數
b)如果數據成員為一個類的實例,則調用該類的拷貝構造函數
c)其他成員按位拷貝
4.默認的賦值構造函數行為
a)先調用父類的賦值構造函數
b)如果數據成員為一個類的實例,則調用該類的賦值構造函數
c)其他成員按位拷貝 www.2cto.com
5.提供顯示的拷貝和賦值構造函數
基本的原則是子類一定要調用父類的相應函數,參考方式
Derive(const Derive& obj):Base(obj)
{
…...
}
Derive& operator =(const Derive &obj)
{
if ( this == &obj )
return *this;
//方式一
Base::operator =(obj);
//方式二
static_cast<Base&>(*this) = obj;
return *this;
}
另外當你的成員變量有const或者引用,系統無法為你提供默認的拷貝和賦值構造函數,我們必須自己處理這些特殊的情況