提问人:dg141 提问时间:3/9/2023 最后编辑:Remy Lebeaudg141 更新时间:3/9/2023 访问量:66
分配类变量 Outsite 构造函数正文 [duplicate]
assigning a class variable outsite constructor body [duplicate]
问:
我对C++非常陌生,并且正在按照本教程进行操作,并遇到了这个类构造函数:
class Player: public Entity
{
private:
std::string m_Name;
public:
Player(const std::string& name)
: m_Name(name) {}
std::string GetName() override
{
return m_Name;
}
};
所以,据我了解,当我们创建类的实例时,我们将 a 传递到构造函数中,并且它设置 ,但为什么它以一种奇怪的方式定义而不是在构造函数的主体内?name
m_Name = name
{}
我尝试了下面的替代方案,它的工作原理都一样:
Player(const std::string& name)
{
m_Name = name;
}
我只是想知道第一个例子中发生了什么。
答:
0赞
Vlad from Moscow
3/9/2023
#1
在此构造函数中
Player(const std::string& name)
: m_Name(name) {}
该对象是使用类的复制构造函数创建的。m_Name
std::string
在此构造函数中
Player(const std::string& name)
{
m_Name = name;
}
首先,使用类的默认构造函数创建对象,然后在类的构造函数的主体中使用类的复制赋值运算符将 的值分配给对象。m_Name
std::string
Player
std::string
name
m_Name
也就是说,在类的构造函数的主体中,应已经创建了数据成员。Player
m_Name
因此,通常仅使用复制构造函数创建对象比调用默认构造函数和复制赋值运算符更有效。
使用构造函数的第二个实现的另一个问题是,您不能以这种方式创建类的常量数据成员,或者您也不能初始化具有引用类型的数据成员。
常量对象和引用应在创建时初始化。
例如,如果要声明以下类
class A
{
private:
std::string &m_Name;
public:
A( std::string &name )
{
m_Name = name;
}
};
然后编译器将发出一个错误,指出必须初始化引用。
但是,如果您将构造函数更改为例如
A( std::string &name ) : m_Name( name )
{
}
然后代码就会编译成功。
评论
const std::string m_Name;