2011-07-13 204 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