假设我参加了这个类:
class MyClass
{
private:
bool mIsMeter = false;
public:
MyClass(bool isMeter = false) {
mIsMeter = isMeter;
}
~MyClass() {
}
};
现在,在
myClasses.h
中,我写:MyClass mMyClass;
它使用堆栈中的默认CTOR实例化该类(在我的示例中,使用
isMeter = false
)。如果我想(从那里)通过true
作为参数来初始化类怎么办?我可以用
myClasses.cpp
做到这一点,但是比起它首先会创建mMyClass
与false
的堆栈叠加,然后使用mMyClass = MyClass(true)
重新分配它。是不是浪费资源?不能只是从标题初始化它吗?
最佳答案
每个变量定义都可以包含一个初始化程序。对于您的情况,您可以这样做:
MyClass mMyClass(true);
请注意,这假设
mMyClass
是全局(或命名空间范围)变量。如果是这种情况,请注意,它将在每个包含 header 的文件中定义。因此,如果将其包含在多个文件中,则会出现链接器错误(多个定义)。如果
mMyClass
实际上是在另一个类定义(该名称以m
开头的名称似乎表明)中声明的成员,则当然不适用多定义注释。仍然可以在声明时初始化mMyClass
,但是您必须使用复制初始化或列表初始化:// either
MyClass mMyClass = true; // this one might call copy ctor
// or
MyClass mMyClass{true}; // this one guarantees one ctor call only
但是,您也可以将其初始化为包含类的构造函数的mem-initializer-list的一部分。那将是这样的:
class OtherClass
{
MyClass mMyClass;
public:
OtherClass(int i) : mMyClass(i > 42) {}
};
关于c++ - 如何通过选择合适的CTOR的头实例类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40397311/