这个可以吗?
Object::Object()
{
new (this) Object(0, NULL);
}
这个可以吗?
Object::Object()
{
new (this) Object(0, NULL);
}
使用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) {
/* ... */
}
this
上使用placement new本身是否是未定义的行为,还是仅取决于类具有哪些成员而可能是未定义的行为?如果该类只有POD类型的成员,这样做是否安全? - Rob Kennedy我相信您希望使用委托构造函数,就像Java一样,但这在目前还不支持。当C++0x到来时,您可以这样实现:
Object::Object() : Object(0, NULL)
{
}
Object
是一个 POD 类型,你可以用以下方式初始化它:class Object
{
int x;
int y;
// ...
public:
Object() { memset( this, 0, sizeof Object ); }
};
boost::noninheritable
可以用来确保没有人会从 Object
继承。 - Kirill V. Lyadvinsky