c++中定義了一個類的對象之後,還能再調用對象的構造函數嗎?
能,利用
https://en.cppreference.com/w/cpp/language/new#Placement_new?en.cppreference.com例如
struct Foo
{
};Foo foo;
new (foo) Foo(); // 在原有的 foo 對象上重新構造一個 Foo 類型的對象
// 由於原先的 foo 的存儲被新構造的 Foo 對象重用,原有的 foo 對象生命期終止
// 注意這並不會自動調用原有的 foo 的析構函數,此處是允許的
// 但如果有依賴於 Foo 的析構函數調用的副作用的代碼存在,則行為是未定義的
不能。
印象中課上講過就是不能的,但長期沒想過這個問題有些猶豫所以測試了一下。
如果顯式調用構造函數
class A {
public:
A() {}
};int main() {
A a;
a.A();
return 0;
}
必定報錯這沒有什麼好質疑的。
然後就想到大一寫過的一種錯誤的代碼:用成員函數再次調用構造函數。
#include &
using namespace std;
class A {
public:
A() {
cout &編譯能過,而且能輸出兩個constructor function.
於是我初學的時候在很長一段時間認為是可以多次調用構造函數的。
然後剛剛細想了一下,這兩個A是一樣的嗎?
於是輸出了一下對象的地址。
#include &
using namespace std;
class A {
public:
A() {
cout &發現,雖然表面上輸出了兩個constructor function,但他們所屬的對象並不一樣。