c++ 一個構造函數 調用 另一個 構造函數


由於最近寫的代碼 發現有點異常,值怎么是錯誤的呢?明明修改了的。

經過調試,發現原來 是構造函數里面的問題。

搜索: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,使用"{}")。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM