本來今天吧,想寫一個proxy class的范例,寫着寫着出了個問題,見如下代碼
const int _cap = 10; Array1D* _elemArray = new Array1D[_cap];
同時我為Array1D這個類寫了一個構造函數來頂替編譯器自動生成的
Array1D(int inx) { _elemNum = new T[inx]; }
隨后報錯,提示沒有合適的默認構造函數,但是顯然,我這里是提供了一個構造函數的,那么問題就出在現有的構造函數不能應對上面的new語句
聯系vector的構造:vector<int>* vec = new vector<int>[20](25); 20是一個vector數組的長度,25是數組中每個vector的長度,則我們可以知道,這里面應該傳遞了有三種信息:
1.對new分配內存來說,申請內存的對象類型是個vector
2.一共有20個這樣的對象
3.25作為這些對象的構造函數的第一個參數傳入
那么根據new Array1D[_cap]來看,_cap並不是作為一個參數傳遞給了Array1D這個類的構造函數,而是作為new函數的一個參數分配內存所用
也就是說,上述的代碼可以這樣看new(Array1D,_cap,③);
其中的③應該是傳遞給構造函數的參數
則顯然,上面我提供的構造函數必須要有一個參數存在(因為沒有使用默認值,事實上這個問題如果給inx一個默認值就不需要提供一個新的無參數構造函數了,不過分離這個問題出來對理解C++的構造函數更有幫助,我覺得使用默認值有點繞開這個問題的意思(逃)),但最上面的代碼並沒有提供這一參數,故此處實際上是需要一個沒有參數的構造函數添加進代碼(在此代碼中實際上也沒需要,空函數體也沒問題),之后便通過了編譯。
