C++ 如何在构造函数中禁用字段初始化?

C++ 如何在构造函数中禁用字段初始化?,c++,constructor,malloc,C++,Constructor,Malloc,是否可以在构造函数中禁用字段初始化?我不想让我的类的构造函数调用这个类的字段的构造函数,如果不使用malloc我怎么做呢?我想这样做是为了避免在这样的代码中出现双重初始化: class A() { A(int n): N(n) {} } class B() : public A() { B(int n) : A(n) {} B() { new(this) B(42); } } 我觉得我理解您的问题,您希望委派构造函数,但这仅在C++11中可用 c

是否可以在构造函数中禁用字段初始化?我不想让我的类的构造函数调用这个类的字段的构造函数,如果不使用malloc我怎么做呢?我想这样做是为了避免在这样的代码中出现双重初始化:

class A() {
   A(int n): N(n) {}
}

class B() : public A() {
    B(int n) : A(n) {}
    B() {
        new(this) B(42);
    }
}

我觉得我理解您的问题,您希望
委派构造函数
,但这仅在C++11中可用

class Notes {
  int k;
  double x;
  std::string st;
public:
  Notes();
  Notes(int);
  Notes(int, double);
  Notes(int, double, std::string);
};

Notes::Notes(int kk, double xx, std::string stt) : k(kk),
  x(xx), st(stt) {/*do stuff*/}
Notes::Notes() : Notes(0, 0.01, "Oh") {/* do other stuff*/}
Notes::Notes(int kk) : Notes(kk, 0.01, "Ah") {/* do yet other stuff*/ }
Notes::Notes( int kk, double xx ) : Notes(kk, xx, "Uh") {/* ditto*/ }

简单地说:你不能。成员的构造函数称为“始终”。这是好的,因为如果一个对象的可行部分丢失了,它就不会被构造。我的意思是反对选择。C++中的可选选项应用指针或<代码> Boo::可选的< /代码>,如注释中所建议的。 此外,如果你在构造函数中调用placement new,这是一种语言犯罪,因为你第二次初始化了一个对象。简单地说,在这里,您正在处理对象生命周期,这是一个可疑的、容易出错的、最难理解和维护的问题

在C++03中,您所寻找的是不可能的。然而,在C++11中可能出现的是所谓的委托构造函数,这可能就是您正在寻找的:

class B() : public A() {
    B(int n) : A(n) {}
    B() : B(42) //delegate the default ctor to the int ctor
    { /* do more stuff*/ } 
}

但是,您不能用它们做任何事情-您可以调用同一类的另一个构造函数。

使它们成为指针或将它们包装在boost::optional中(boost::optional仍将被称为tho..)仍然希望将它们的指针设置为null tho,而不生成指针?不行?是要禁用初始化还是要禁用构造函数调用?这是两件不同的事情。前者对于豆荚类型很容易实现,而后者则相当不可能。无论如何,这听起来确实像是新手的过早优化。这听起来像是试图优化一些不是优化的东西(如果不需要,编译器会为您优化),或者是一个XY问题,您在问Y,因为您想实现X。如果您想做X,请解释一下,我们或许可以帮你找到答案。此外,这将有助于理解N是什么。它来自哪里[它不在您的代码段中,因此此代码无法编译!]