2009-08-03 67 views

回答

9

使用new(this)將重新構造成員變量。這可能會導致未定義的行爲,因爲它們並未首先被破壞。通常的模式是使用一個輔助函數:

class Object { 
private: 
    void init(int, char *); 
public: 
    Object(); 
    Object(int, char *); 
}; 

Object::Object() { 
    init(0, NULL); 
} 

Object::Object(int x, char *y) { 
    init(x, y); 
} 

void Object::init(int x, char *y) { 
    /* ... */ 
} 
+0

因此,在`this`上使用放置new,本身是未定義的行爲,還是隻有*潛在的*未定義的行爲,取決於該類有哪些成員?如果這個類只有POD類型的成員,那麼這樣做是否安全? – 2009-08-03 04:40:41

+0

假設還有其他陷阱(虛擬功能等)也可以避免,潛在的。 ctors和dtors的行爲是非常明確的。如果所有成員都是POD,那麼最初的ctor和新的placement都不會做任何事情。 – MSalters 2009-08-03 07:52:35

2

我相信你想委託構造,像Java例如,這是還沒有到來。當的C++ 0x來,你可以做這樣的:

Object::Object() : Object(0, NULL) 
{ 

} 
+0

您的意思是C++ 0x嗎?儘管直到201x還沒有準備好,它的名字仍然是C++ 0x。如果你確實是指C++ 1x,那麼這是一個特別無用的答案。 – 2009-08-03 03:29:44

0

如果ObjectPOD類型,你可以用這種方式初始化:

class Object 
{ 
    int x; 
    int y; 
    // ... 
public: 
    Object() { memset(this, 0, sizeof Object); } 
};