c 中構造函式呼叫建構函式

2021-07-12 00:17:14 字數 1058 閱讀 2336

c++中建構函式完成的工作分兩步:1 分配空間 2 初始化空間

構造函式呼叫建構函式。

class a 

a(int a)

private:

int _a

};

這樣會導致,a()中先分配了空間,然後呼叫a(0)又建立了乙個臨時物件,然後初始化為0,而原物件則沒有初始化。。這種問題在類中有指標需要分配空間時會導致災難。。

從析構函式的呼叫次數也可以看出

#include using namespace std;

class a

a()a(double a)

~a()

};int main ()

/*a()

a(double )

a(int )

~a()

~a()

~a()

*/

但是,c++11支援了成員初始化列表呼叫建構函式

#include using namespace std;

class a

a(): a(10.0)

a(double a): a(int(a))

~a()

};int main ()

/*a(int )

a(double )

a()~a()

*/

記錄乙個編譯錯誤

database.cc:530:90: error: cannot bind 『std::basic_ostream』 lvalue to 『std::basic_ostream&&』

首先如果在乙個.h檔案中定義函式的實現的話(寫在類{}內的除外,以為會inline),當這個h被包含多次會報重複定義

需要在.h中宣告,在.cpp中定義。

但是對於模版函式就不同了。

模版函式需要按要求展開成很多份,如果像 上面 的方案的話。會報未定義。。要直接定義在.h中。這樣在編譯時才會展開成多份。而且編譯器會幫助處理 重複定義的 錯誤。

C 中構造函式呼叫建構函式

include include using namespace std struct cls cls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體 非靜態資料成員是未初始化的 2 ...

C 中構造函式呼叫建構函式

include stdlib.h include iostream using namespace std struct clscls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體...

C 中構造函式呼叫建構函式

include include using namespace std struct cls cls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體 非靜態資料成員是未初始化的 2 ...