是否可以在构造函数中禁用字段初始化?我不希望我的类的构造函数调用这个类的字段的构造函数,我怎么能不使用 malloc 呢?我想这样做是为了避免在这样的代码中进行双重初始化:
class A() {
A(int n): N(n) {}
}
class B() : public A() {
B(int n) : A(n) {}
B() {
new(this) B(42);
}
}
是否可以在构造函数中禁用字段初始化?我不希望我的类的构造函数调用这个类的字段的构造函数,我怎么能不使用 malloc 呢?我想这样做是为了避免在这样的代码中进行双重初始化:
class A() {
A(int n): N(n) {}
}
class B() : public A() {
B(int n) : A(n) {}
B() {
new(this) B(42);
}
}
我觉得我理解你的问题,你想要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*/ }
简单地说:你不能。成员的构造函数总是被调用。这很好,因为如果缺少可行的部分,则不会构建对象。可行我的意思是反对可选。C++ 中的可选应该通过指针或boost::optional
注释中的建议来表示。
此外,如果您在构造函数中在 this 上调用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*/ }
}
然而,你不能用它们做所有事情——你只能调用同一个类的另一个构造函数。