C ++构造函数名称后面的冒号是做什么的?
这个问题在这里已经有了答案:
这是一个初始化列表 ,是构造函数实现的一部分。
构造函数的签名是:
MyClass();
这意味着可以不带参数调用构造函数。 这使得它成为默认的构造函数,也就是说,当你编写MyClass someObject;
时候默认调用它MyClass someObject;
。
部分: m_classID(-1), m_userdata(0)
被称为初始化列表 。 这是一种用你选择的值初始化你的对象的某些字段(如果你想要的话),而不是将它们保留为未定义的。
执行初始化列表后,执行构造函数主体(在您的示例中恰好为空)。 在它里面你可以做更多的任务,但是一旦你输入了,所有的字段都已经被初始化 - 或者是随机的,未指定的值,或者是你在初始化列表中选择的值。 这意味着您在构造函数体中执行的任务不会是初始化,而是值的更改。
这是一个初始化列表。
当你进入构造函数的主体时,所有的字段都已经被构造了; 如果他们有默认的构造函数,那些已经被调用。 现在,如果您在构造函数的主体中为它们赋值,那么您正在调用复制赋值运算符,这可能意味着释放和重新获取资源(如内存)(如果该对象有任何内容)。
因此,在像int这样的基本类型的情况下,与在构造函数中分配它们相比,没有什么优势。 在具有构造函数的对象的情况下,它是一种性能优化,因为它避免了经历两个对象初始化而不是一个。
如果其中一个字段是引用,则初始化列表是必需的,因为引用永远不能为空,即使在对象构造和构造函数主体之间的短暂时间内也是如此。 以下引发错误C2758:'MyClass :: member_':必须在构造函数基础/成员初始值设定项列表中初始化
class MyClass {
public :
MyClass(std::string& arg) {
member_ = arg;
}
std::string& member_;
};
唯一正确的方法是:
class MyClass {
public :
MyClass(std::string& arg)
: member_(arg)
{
}
std::string& member_;
};
它表示初始化列表的开始,它用于初始化对象的成员变量。
至于: MyClass(m_classID = -1, m_userdata = 0);
这声明了一个可以带参数的构造函数(所以我可以使用MyClass m = MyClass(3, 4)
创建一个MyClass
,这会导致m_classID
为3,并且m_userdata
为4)。 如果我不向MyClass
构造函数传递参数,它将导致为具有初始化列表的版本创建一个等效对象。
上一篇: What does a colon following a C++ constructor name do?
下一篇: c++