由於最近寫的代碼 發現有點異常,值怎麼是錯誤的呢?明明修改了的。
經過調試,發現原來 是建構函式裡面的問題。
搜尋:c++ 一個建構函式 調用 另一個 建構函式
發現,原來這就是一個普遍的問題,編譯器也木有給警告,其實文法完全合理,如果是java的話,應該沒問題。
那麼C++ 如何 從一個建構函式調用另一個建構函式呢?
應該使用下面的方法。
new (this)建構函式(不同的參數);
參考自: http://www.cnblogs.com/chio/archive/2007/10/20/931043.html
我發現問題,還 在建構函式裡 return 另一個建構函式,是錯誤的,因為建構函式沒有傳回值。
但是 你的 執行個體卻可以直接 使用 建構函式複製。哦對,類 預設 有一個 = 的 操作符。
指標 也可以 指標=new 建構函式(); 都是記憶體的拷貝而已了。
new 操作符 ,與之前搜尋到的 new 一定要delete嗎? 的一些答案類似。此new 是操作符。
標準庫中定位new運算式(placement new)的定義
inline void *__cdecl operator new(size_t, void *_P)
{
return (_P);
}
STL中的原型如下:1: void * operator new (size_t, const std::nothrow_t &)
throw();
2: void * operator new (size_t, void *) throw();
3: void *
operator new[] (size_t, const std::nothrow_t &) throw();
4: void *
operator new[] (size_t, void *) throw();該運算式的形式如下:
發現
http://forum.ubuntu.org.cn/viewtopic.php?t=315229
所討論的 使用this->調用 其他 建構函式 應該也可以的吧。。。
經過實驗 發現 貌似也不行: 提示錯誤 error C2273: “函數樣式轉換”: 位於“->”運算子右邊時非法
如果使用 private 函數 應該可以的哦。。。不嘗試了。
下面的討論中的下段資料也不錯:
http://topic.csdn.net/u/20091219/18/4973528c-b6dd-4479-975d-54072cbcef9e.html
下面內容引自
http://zh.wikipedia.org/zh-cn/C%2B%2B0x#.E7.89.A9.E4.BB.B6.E5.BB.BA.E6.A7.8B.E7.9A.84.E6.94.B9.E8.89.AF
對象建構的改良
在標準C++中,建構式不能調用其它的建構式;每個建構式必須自己初始化所有的成員或是調用一個共用的成員函數。基類的建構式不能夠直接作為衍生類別的建構式;就算基類的建構式已經足夠,每個衍伸的類仍必須實做自己的建構式。類中non-constant的資料成員不能夠在聲明的地方被初始化,它們只能在建構式中被初始化。
C++0x將會提供這些問題的解決方案。
C++0x允許建構式調用其他建構式,這種做法稱作委託或轉接(delegation)。
僅僅只需要加入少量的代碼,就能讓數個建構式之間達成功能複用(reuse)。 Java以及C#都有提供這種功能。C++0x 文法如下:
class SomeType { int number; string name; SomeType( int i, string& s ) : number(i), name(s){}public: SomeType( ) : SomeType( 0, "invalid" ){} SomeType( int i ) : SomeType( i, "guest" ){} SomeType( string& s ) : SomeType( 1, s ){ PostInit(); }};
C++03中,建構式運行退出代表對象建構完成; 而允許使用轉接建構式的 C++0x 則是以"任何"一個建構式退出代表建構完成。 使用轉接的建構式,函數本體中的代碼將於被轉接的建構式完成後繼續運行(如上例的 PostInit())。 若基底類使用了轉接建構式,則衍生類別的建構式會在"所有"基底類的建構式都完成後, 才會開始運行。
C++0x 允許衍生類別手動繼承基底類的建構式,
編譯器可以使用基底類的建構式完成衍生類別的建構。 而將基類的建構式帶入衍生類別的動作, 無法選擇性地部分帶入,
要不就是繼承基類全部的建構式,要不就是一個都不繼承(不手動帶入)。
此外,若牽涉到多重繼承,從多個基底類繼承而來的建構式不可以有相同的函數簽名(signature)。
而衍生類別的新加入的建構式也不可以和繼承而來的基底建構式有相同的函數簽名,因為這相當於重複聲明。
文法如下:
class BaseClass{public: BaseClass(int iValue);}; class DerivedClass : public BaseClass{public: using BaseClass::BaseClass;};
此文法等同於 DerivedClass 聲明一個DerivedClass(int) 的建構式。 同時也因為 DerivedClass 有了一個繼承而來的建構式,所以不會有預設建構式。
另一方面,C++0x可以使用以下的文法完成成員初始化:
class SomeClass{public: SomeClass() {} explicit SomeClass(int iNewValue) : iValue(iNewValue) {} private: int iValue = 5;};
若是建構式中沒有設定iValue的初始值,則會採用類定義中的成員初始化,令iValue初值為5。在上例中,無參數版本的建構式,iValue便採用預設所定義的值; 而帶有一個整數參數的建構式則會以指定的值完成初始化。
成員初始化除了上例中的賦值形式(使用"=")外,也可以採用建構式以及統一形的初始化(uniform
initialization,使用"{}")。