2009-12-13 171 views

回答

58

不是before C++11

改爲將通用功能提取爲單獨的功能。我通常將這個函數命名爲構造()

「所謂的」第二次調用會編譯,但在C++中有不同的含義:它會構造一個新對象,一個臨時對象,然後在聲明結束時立即刪除它。所以不行。

但是,可以調用析構函數而不會出現問題。

+2

+1 - 和'construct()'是個好名字。 – peterchen 2009-12-13 12:51:12

+5

+1 - 您應該補充說,可以在下一個C++版本(C++ 0x)中從同一個類中的構造函數中調用構造函數。請參閱http://www2.research.att.com/~bs/C++0xFAQ.html#delegating-ctor – Klaim 2009-12-13 23:53:29

+0

您可以舉一個construct()函數的例子嗎?我知道這很簡單,但我認爲人們會覺得它很有用。 – MattClimbs 2017-04-08 23:36:30

16

之前沒有C++0x,沒有。

,但我想出了一個非常可怕的方式*使用位置運算符做只是出於學術興趣的「新」(有人照顧指出如何便攜式這是什麼?)

#include <new> 
#include <iostream> 

class A 
{ 
public: 
    A(int i, int j) 
     : i_(i), j_(j) { } 

    A(int i) 
    { new (this) A(i, 13); } 

    int i_,j_; 
}; 

int 
main() { 
    A a1(10,11), a2(10); 
    std::cout 
     << a1.i_ << ", " 
     << a1.j_ << std::endl 
     << a2.i_ << ", " 
     << a2.j_ << std::endl; 
    return 0; 
} 

*地獄不,我不寫在生產代碼中。

+1

我認爲它非常便攜; placement-new在ISO C++標準中。「然而,其他用途包括直接調用構造函數,這是C++語言不允許的。」 維基百科:http://zh.wikipedia.org/wiki/Placement_syntax – haavee 2010-06-24 13:20:06

+4

如果A派生自B類,會發生什麼? B的構造函數將被調用,然後A將調用新的A'(另一個構造函數),並覆蓋B已經完成的所有內容,然後再調用B,然後調用A'。結論:如果B做了一些有意義的事情(即分配資源),這會破壞代碼(即引發資源泄漏)。 – paercebal 2010-10-16 08:19:12

+0

@paercebal是的,如果A是抽象類,這也是行不通的。 – 2010-10-16 10:03:13

5

答案實際上是「是」,但正如其他人所暗示的那樣,它沒有做到你想要的。您當然可以使用基類的構造函數,或者隱式地或顯式地使用:

struct B { 
    B() {} 
    B(int x) {} 
}; 

struct A : public B { 
    A() {} // calls B() implicitly 
    A(int a, int b) : B(b) {} // calls B(int) explicitly 
}; 
3

不是直接的。有幾種方法可以解決這個問題。

從類的構造函數的初始化程序列表中,可以在任何基類和所有成員變量上調用構造函數。

所以,你通常可以重構你的班級,並將其分成幾個小班級來解決問題。通常執行的代碼可以放在成員對象或基類中。然後,每個主類的構造函數都必須決定使用哪個構造函數來初始化該成員。

class B { 
    B() { } 
    B(int b) { DoSomething(); } 
} 
class A{ 
    A(int a = 5) : b(a) { } // call B's constructor which does something 
    A() : b() {} // call B's constructor which does nothing 

    B b; 
}; 
1

這是一個老問題;然而,

class A{ 
    A(int a = 5){ 
    DoSomething(); 
    A(); 
    } 
    A(){...} 
} 

可能是

class A{ 
    A(int a = 5){ 
    *this = A(); 
    DoSomething(); 
    } 
    A(){...} 
} 
+1

我認爲賦值'* this = A();'它會使用默認的拷貝構造函數(如果你還沒有定義一個),這可能不是你想要的嗎? – austinmarton 2016-04-20 22:43:13

相關問題