每一個類只有一個析構函數和一個賦值函數,但能夠有多個構造函數(包含一個拷貝構造函數,其它的稱爲普通構造函數)。對於任意一個類A,若是不編寫上述函數,C++編譯器將自動爲A 產生四個缺省的函數,例如:程序員
A(void);//缺省的無參數構造函數函數
A(const A&a);//缺省的拷貝構造函數this
~A();//缺省的析構函數spa
A&operator=(const A &a);//缺省的賦值構造函數指針
1)、「缺省的拷貝構造函數」和「缺省的賦值函數」均採用「位拷貝」而非「值拷貝」的方式來實現,假若類中含有指針變量,這兩個函數註定將出錯。code
2)、當類尚未生成的時候,調用大是拷貝構造函數,當類已經生成的時候,調用的是賦值構造函數,以下所示:對象
A a;blog
A b;ci
b = a;//此時類a和b都已經生成了,因此調用的是賦值構造函數編譯器
A c;
A d=c;//此時類d尚未生成,因此調用的是拷貝構造函數
3)、全部的函數調用傳參數,調用的都是拷貝構造函數。若是函數參數用的是引用類型,則不會發生參數的拷貝,也就不會調用任何函數了。
以下:
void print_a(const A a);//調用拷貝構造函數
void print_b(const A &a);//爲引用,不會調用任何函數
4)、拷貝構造函數和賦值構造函數對實現。
A::A(const A&a)
{
}
拷貝構造函數沒有返回,爲一個全新的類。
A &A::operator=(const A&a)
{
return *this;
}
賦值構造函數返回自身,即*this,爲在原先的類上大操做。
explicit:explicit構造函數是用來防止隱式轉換的。
C++提供了關鍵字explicit,聲明爲explicit的構造函數不能在隱式轉換中使用。
class Test1 { public: Test1(int n) { num=n; }//普通構造函數 private: int num; }; class Test2 { public: explicit Test2(int n) { num=n; }//explicit(顯式)構造函數 private: int num; }; int main() { Test1 t1=12;//隱式調用其構造函數,成功 Test2 t2=12;//編譯錯誤,不能隱式調用其構造函數 Test2 t2(12);//顯式調用成功 return 0; }