如何从 Header 实例化 Class 选择合适的 CTOR?
How to instance Class from Header selecting a proper CTOR?
假设我有这个 class:
class MyClass
{
private:
bool mIsMeter = false;
public:
MyClass(bool isMeter = false) {
mIsMeter = isMeter;
}
~MyClass() {
}
};
现在,在 myClasses.h
内,我写:
MyClass mMyClass;
它使用堆栈中的默认 CTOR 实例 class(在我的示例中,使用 isMeter = false
)。如果我想(从那里)初始化 class 传递 true
作为参数怎么办?
我可以在 myClasses.cpp
中完成,但它会首先使用 false
创建 mMyClass
的堆栈转换,然后使用 mMyClass = MyClass(true)
re-allocate ].
这不是浪费资源吗?不能只从 header 初始化它吗?
每个变量定义都可以包含一个初始化程序。在你的情况下,你会这样做:
MyClass mMyClass(true);
请注意,这假定 mMyClass
是全局(或 namespace-scope)变量。如果是这种情况,请注意它将在包含 header 的 each 文件中定义。因此,如果您将其包含在多个文件中,则会出现链接器错误(多重定义)。
如果 mMyClass
实际上是在另一个 class 定义中声明的成员(以 m
开头的名称似乎表明),那么 multiple-definition 注释当然不会'申请。仍然可以在声明时初始化 mMyClass
,但您必须使用 copy-initialisation 或 list-initialisation:
// either
MyClass mMyClass = true; // this one might call copy ctor
// or
MyClass mMyClass{true}; // this one guarantees one ctor call only
但是,您也可以将其初始化为包含 class 的构造函数的 mem-initializer-list 的一部分。那将是这样的:
class OtherClass
{
MyClass mMyClass;
public:
OtherClass(int i) : mMyClass(i > 42) {}
};
假设我有这个 class:
class MyClass
{
private:
bool mIsMeter = false;
public:
MyClass(bool isMeter = false) {
mIsMeter = isMeter;
}
~MyClass() {
}
};
现在,在 myClasses.h
内,我写:
MyClass mMyClass;
它使用堆栈中的默认 CTOR 实例 class(在我的示例中,使用 isMeter = false
)。如果我想(从那里)初始化 class 传递 true
作为参数怎么办?
我可以在 myClasses.cpp
中完成,但它会首先使用 false
创建 mMyClass
的堆栈转换,然后使用 mMyClass = MyClass(true)
re-allocate ].
这不是浪费资源吗?不能只从 header 初始化它吗?
每个变量定义都可以包含一个初始化程序。在你的情况下,你会这样做:
MyClass mMyClass(true);
请注意,这假定 mMyClass
是全局(或 namespace-scope)变量。如果是这种情况,请注意它将在包含 header 的 each 文件中定义。因此,如果您将其包含在多个文件中,则会出现链接器错误(多重定义)。
如果 mMyClass
实际上是在另一个 class 定义中声明的成员(以 m
开头的名称似乎表明),那么 multiple-definition 注释当然不会'申请。仍然可以在声明时初始化 mMyClass
,但您必须使用 copy-initialisation 或 list-initialisation:
// either
MyClass mMyClass = true; // this one might call copy ctor
// or
MyClass mMyClass{true}; // this one guarantees one ctor call only
但是,您也可以将其初始化为包含 class 的构造函数的 mem-initializer-list 的一部分。那将是这样的:
class OtherClass
{
MyClass mMyClass;
public:
OtherClass(int i) : mMyClass(i > 42) {}
};