成员初始化

时间:2011-07-13 16:52:54

标签: c++ member-initialization

  

可能重复:
  C++ initialization lists

成员初始化和类中的直接初始化有什么区别? 这个类中定义的两个构造函数有什么区别?

class A
{
    public:
    int x;
    int y;
    A(int a, int b) : x(a), y(b)
    {}

    A(int a, int b)
    {
        x = a;
        y = b;
    }
};

2 个答案:

答案 0 :(得分:5)

其他成员已经给出了理论答案。

实际上,在这些情况下使用成员初始化:

  • 您的班级中有参考属性MyClass & mMyClass)。您需要进行成员初始化,否则,它不会编译。
  • 您的班级(const MyClass mMyClass)中有常量属性。您还需要进行成员初始化,否则,它不会编译。
  • 您的班级(MyClass mMyClass没有构造函数MyClass::MyClass())的属性没有默认构造函数。您还需要进行成员初始化,否则,它不会编译。
  • 您有一个 monstrutruous large attribute 对象(MyClass mMyClasssizeof(MyClass) = 1000000000)。使用成员初始化,您只需构建一次。通过构造函数中的直接初始化,它可以构建两次。

答案 1 :(得分:4)

第一个使用初始化,第二个不使用初始化,它使用赋值。在第二个中,成员xy首先默认初始化(),然后为其分配a和{{ 1}}分别。

另请注意,在第二个成员中,只有当成员的类型具有非平凡的默认构造函数时,成员才会默认初始化。否则,没有初始化(如评论中注明的@James)。

现在请看这个主题: