C ++构造函数名称后面的冒号是做什么的?

这个问题在这里已经有了答案:

  • 构造函数中这个奇怪的冒号成员(“:”)语法是什么? 12个答案

  • 这是一个初始化列表 ,是构造函数实现的一部分。

    构造函数的签名是:

    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构造函数传递参数,它将导致为具有初始化列表的版本创建一个等效对象。

    链接地址: http://www.djcxy.com/p/12721.html

    上一篇: What does a colon following a C++ constructor name do?

    下一篇: c++