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 ...