對於默認構造函數,大家的第一印象好像總是認爲這樣的,例如有一個類A
class A{
public:
A():a(0),b(2.09) {}
private:
int a ;
double b;
string str;
};
好像總以爲默認構造函數都是形參表中沒有形參的那種。但事實上還有一種默認構造函數他是有形參的,只不過其中的形參都帶有默認實參。
如
class A{
public:
A(int c=0, double d=4.6):a(c),b(d) {}
private:
int a ;
double b;
string str;
};
這也是一個默認構造函數。默認構造函數可以自己定義,也可以靠編譯器來合成。但是兩者在應用中還是有不同用途的。
合成的默認構造函數初始化數據成員的原則是初始化變量的原則,即:類類型的數據成員通過調用其相應類的默認構造函數初始化,內置和複合類型的數據成員根據其定義的位置決定,在全局作用於定義的對象時才進行初始化,在局部作用於中定義的對象不作初始化,因此我們可以看到,當你的數據成員中含有內置類型或者複合類型時,最好自己定義一個默認構造函數,不要依靠編譯器合成,那樣會帶來不必要的麻煩和限制了類的應用。自己定義的一個默認構造函數對內置類型和複合類型數據成員做初始化。還要注意,如果你定義了一個構造函數,不管是普通的還是默認的構造函數,編譯器都不會在爲你合成默認構造函數了。
隱式類類型轉化
注意,在C++的類中,用單個實參來調用的構造函數定義了從形參類型到該類類型的一個隱式轉換。注意條件:“單個實參調用”
此處在實踐中好像很混亂,請教了很多人好像此處的規定與不同版本的編譯器有關,不是太專業,就不水了。抑制隱式轉換可以使用explicit關鍵字。
複製構造函數
複製構造函數是一種特殊的構造函數,它有單個形參,而且該形參是對該類類型本身的引用。
複製構造函數主要有以下幾種用處:
1.根據同一個類型的對象顯式或隱式的初始化另一個對象;
2.複製一個對象,用於傳遞實參;
3.函數返回一個類對象的時候;
4.初始化順序容器中的元素;
5.根據元素初始化列表初始化數組元素。
複製構造函數的工作原理是:先使用指定的構造函數創建一個臨時對象,然後調用複製構造函數將創建的臨時對象複製到正在創建的對象上
如果不想用戶代碼複製該類類型的對象,應將複製構造函數顯式聲明爲private
還有一個問題
見下面這篇博客,個人認爲回答的很好!!!!