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

时间:2013-01-19 10:26:04

标签: 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);
    }
}

2 个答案:

答案 0 :(得分:1)

我觉得我理解你的问题,你想要Delegating Constructors,但这只适用于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*/ }

答案 1 :(得分:1)

简单地说:你不能。成员的构造函数总是被调用。它很好,因为如果物体的可行部分缺失,物体就不会被建造。可行,我的意思是反对可选。 C ++中的可选项应由指针或boost::optional表示,如评论中所示。

此外,如果您在构造函数中调用new 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*/ } 
}

但是,你无法与他们一起所有 - 你可以调用同一个类的另一个构造函数。