假设我参加了这个类:

class MyClass
{
private:
    bool mIsMeter = false;

public:
    MyClass(bool isMeter = false) {
        mIsMeter = isMeter;
    }
    ~MyClass() {

    }
};

现在,在myClasses.h中,我写:
MyClass mMyClass;

它使用堆栈中的默认CTOR实例化该类(在我的示例中,使用isMeter = false)。如果我想(从那里)通过true作为参数来初始化类怎么办?

我可以用myClasses.cpp做到这一点,但是比起它首先会创建mMyClassfalse的堆栈叠加,然后使用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/

10-11 16:57