C++ 新操作员的这种用法有什么问题?

C++ 新操作员的这种用法有什么问题?,c++,C++,允许这样做吗 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, NUL

允许这样做吗

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) {
  /* ... */
}

我相信您需要委托构造函数,比如Java,它们还没有出现。当C++0x出现时,您可以这样做:

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

}

如果
对象
是一种类型,则可以通过以下方式对其进行初始化:

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

你是说C++0x吗?尽管直到201x才准备好,它的名称仍然是C++0x。如果你真的是指C++1x,那么这是一个特别没有帮助的答案。我以前称它为C++0x,但现在它不再是了:(语法是错误的-C++0x构造函数委托将是Object::Object():Object(0,NULL){}@AraK该语法中不应该有分号。正确的语法应该非常类似于成员变量初始化。这是个坏主意。成员没有被正确地销毁。维护它需要向stackoverflow.com提问是否是个好主意。因此,在
上使用placement new本身就是未定义的beh吗avior,或者它只是潜在的未定义行为,取决于类具有哪些成员?如果类只有POD类型的成员,那么这样做是否安全?假设存在其他陷阱(虚拟函数等)也是避免的,潜在的。ctor和DTOR的行为是非常明确的。如果所有成员都是POD,则初始ctor和新放置都不会起任何作用。我们还没有看到双参数构造函数的实现,因此我们不知道所有位零是否真的是所需的表示。特别是,我们不知道这个系统上的空指针是否为全零位。这似乎有点不可靠……然后有一天,有人来了,决定从Object继承一些东西,比如
boost::noninheritable
,可以用来确保没有人会从
Object
继承。