2011-07-13 206 views
3

可能重复:
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; 
    } 
}; 

回答

5

的理论答案已被其他会员送出。

务实,成员明智的初始化是在这些情况下使用:

  • 您的类参考属性MyClass & mMyClass)。您需要执行成员方式的初始化,否则,它不会编译。
  • 你有一个恒定属性在你的课(const MyClass mMyClass)。您还需要执行成员方式的初始化,否则,它不会编译。
  • 你有一个属性,在你的类中没有默认构造函数MyClass mMyClass没有构造函数)。您还需要执行成员方式的初始化,否则,它不会编译。
  • 你有一个mon大的属性对象(MyClass mMyClasssizeof(MyClass) = 1000000000)。通过成员方式初始化,您只需构建一次。通过构造函数中的直接初始化,它被构建两次。
+0

这就是我一直在寻找的答案。 – cppcoder

+0

我的荣幸!尽管如果你接受它,我会更加高兴! =)(你可以在关闭的时候这么做吗?) – Fezvez

4

第一个使用初始化和第二个没有使用初始化,它采用分配。在第二个中,成员xy首先被默认初始化(其中),然后它们分别被分配了ab

还要注意的是,在第二个,成员是缺省初始化仅当类型的成员都具有非平凡默认构造函数。否则,不会进行初始化(正如@James在评论中指出的那样)。

现在看到这个题目就知道:

+0

+1。虽然对于“int”成员,效果是一样的。 – Nemo

+0

在第二种情况下,仅对具有非平凡默认构造函数的类型进行默认初始化。否则,不会进行初始化。 –

+0

@James:在这个例子中,'x'和'y'的类型是'int',因此它的默认初始化。但是你的评论使得它更完整。让我把它添加到我的答案。 – Nawaz