回答
不是before C++11。
改爲將通用功能提取爲單獨的功能。我通常將這個函數命名爲構造()。
「所謂的」第二次調用會編譯,但在C++中有不同的含義:它會構造一個新對象,一個臨時對象,然後在聲明結束時立即刪除它。所以不行。
但是,可以調用析構函數而不會出現問題。
+1 - 和'construct()'是個好名字。 – peterchen 2009-12-13 12:51:12
+1 - 您應該補充說,可以在下一個C++版本(C++ 0x)中從同一個類中的構造函數中調用構造函數。請參閱http://www2.research.att.com/~bs/C++0xFAQ.html#delegating-ctor – Klaim 2009-12-13 23:53:29
您可以舉一個construct()函數的例子嗎?我知道這很簡單,但我認爲人們會覺得它很有用。 – MattClimbs 2017-04-08 23:36:30
之前沒有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;
}
*地獄不,我不寫在生產代碼中。
我認爲它非常便攜; placement-new在ISO C++標準中。「然而,其他用途包括直接調用構造函數,這是C++語言不允許的。」 維基百科:http://zh.wikipedia.org/wiki/Placement_syntax – haavee 2010-06-24 13:20:06
如果A派生自B類,會發生什麼? B的構造函數將被調用,然後A將調用新的A'(另一個構造函數),並覆蓋B已經完成的所有內容,然後再調用B,然後調用A'。結論:如果B做了一些有意義的事情(即分配資源),這會破壞代碼(即引發資源泄漏)。 – paercebal 2010-10-16 08:19:12
@paercebal是的,如果A是抽象類,這也是行不通的。 – 2010-10-16 10:03:13
答案實際上是「是」,但正如其他人所暗示的那樣,它沒有做到你想要的。您當然可以使用基類的構造函數,或者隱式地或顯式地使用:
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
};
不是直接的。有幾種方法可以解決這個問題。
從類的構造函數的初始化程序列表中,可以在任何基類和所有成員變量上調用構造函數。
所以,你通常可以重構你的班級,並將其分成幾個小班級來解決問題。通常執行的代碼可以放在成員對象或基類中。然後,每個主類的構造函數都必須決定使用哪個構造函數來初始化該成員。
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;
};
這是一個老問題;然而,
class A{
A(int a = 5){
DoSomething();
A();
}
A(){...}
}
可能是
class A{
A(int a = 5){
*this = A();
DoSomething();
}
A(){...}
}
我認爲賦值'* this = A();'它會使用默認的拷貝構造函數(如果你還沒有定義一個),這可能不是你想要的嗎? – austinmarton 2016-04-20 22:43:13
- 1. 在構造函數中調用另一個構造函數
- 2. 從另一個構造函數調用默認構造函數
- 3. 構造函數可以在C++中調用另一個類的構造函數嗎?
- 4. 可以在類的構造函數中使用「new」來調用Java中的另一個構造函數嗎?
- 5. C++的構造函數調用另一個構造
- 6. ponylang:在另一個構造函數中調用構造方法?
- 7. 如何在另一個構造函數中調用對象構造函數?
- 8. 我與另一個構造函數調用構造函數有一個錯誤
- 9. 是否有可能將構造函數放在另一個構造函數的構造函數中?
- 10. 我可以從另一個構造函數調用構造函數嗎(作爲常規方法)?
- 11. 構造函數中的調用基構造函數和其他構造函數
- 12. C#調用構造函數
- 13. 在C++中,構造函數和析構函數可以是內聯函數嗎?
- 14. 使用try/catch內部調用另一個構造函數的構造函數
- 15. 調用一個父構造函數C++
- 16. C++一個類的默認構造函數調用另一個類的另一個默認構造函數
- 17. C++構造函數調用默認構造函數
- 18. 從另一個構造函數調用構造函數的實際場景
- 19. 我可以在外部構造函數中爲參數類型構建一個無參數構造函數嗎?
- 20. 在java中調用繼承構造函數的構造函數
- 21. 在構造函數中調用類成員的構造函數
- 22. 在構造函數中調用不同類的構造函數?
- 23. 如何在其他構造函數中調用構造函數?
- 24. EasyMock:在java中構造一個構造函數調用
- 25. 我們可以調用一個類的構造函數嗎?
- 26. 在另一個構造函數中實例化的對象的構造函數中調用函數
- 27. 在C++中調用的構造函數
- 28. 構造函數不在C++中調用
- 29. 如何使用構造函數的參數來調用C++中另一個類的構造函數?
- 30. 無參數構造函數調用2參數構造函數
類似的問題在這裏:https://開頭的http://stackoverflow.com/questions/308276/c-call-constructor-from-constructor – 2015-01-09 15:24:24