分配类变量 Outsite 构造函数正文 [duplicate]

assigning a class variable outsite constructor body [duplicate]

提问人:dg141 提问时间:3/9/2023 最后编辑:Remy Lebeaudg141 更新时间:3/9/2023 访问量:66

问:

我对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 传递到构造函数中,并且它设置 ,但为什么它以一种奇怪的方式定义而不是在构造函数的主体内?namem_Name = name{}

我尝试了下面的替代方案,它的工作原理都一样:

Player(const std::string& name)
{
    m_Name = name;
}

我只是想知道第一个例子中发生了什么。

C++ 构造函数 copy-constructor copy-assignment

评论

0赞 273K 3/9/2023
尝试一下,你就会明白为什么这是唯一可用的选项。const std::string m_Name;

答:

0赞 Vlad from Moscow 3/9/2023 #1

在此构造函数中

Player(const std::string& name)
    : m_Name(name) {}

该对象是使用类的复制构造函数创建的。m_Namestd::string

在此构造函数中

Player(const std::string& name)
{
    m_Name = name;
}

首先,使用类的默认构造函数创建对象,然后在类的构造函数的主体中使用类的复制赋值运算符将 的值分配给对象。m_Namestd::stringPlayerstd::stringnamem_Name

也就是说,在类的构造函数的主体中,应已经创建了数据成员。Playerm_Name

因此,通常仅使用复制构造函数创建对象比调用默认构造函数和复制赋值运算符更有效。

使用构造函数的第二个实现的另一个问题是,您不能以这种方式创建类的常量数据成员,或者您也不能初始化具有引用类型的数据成员。

常量对象和引用应在创建时初始化。

例如,如果要声明以下类

class A
{
private:
    std::string &m_Name;

public:
    A( std::string &name )
    {
        m_Name = name;
    }
};

然后编译器将发出一个错误,指出必须初始化引用。

但是,如果您将构造函数更改为例如

    A( std::string &name ) : m_Name( name )
    {
    }

然后代码就会编译成功。