2013-03-28 36 views
14

讓我們看看下面的類構造函數初始化Vs的分配

class test1 
{ 
    private: 
     int a; 
     int b; 
    public: 
     test1():a(0),b(0){} 
}; 

class test2 
{ 
    private: 
     int a; 
     int b; 
    public: 
     test2() 
     { 
      a=0; 
      b=0; 
     } 
}; 

現在,我知道test1() constructor是初始化一個class的數據成員的正確方法,因爲在test2()我們要進行分配和未初始化。我的問題是:

  1. 如果我們執行賦值而不是初始化,會出現什麼問題?
  2. test1()構造函數的情況下,編譯器是否不在內部執行賦值?如果否,那麼這些初始化是如何進行的?
+5

看到http://www.parashift.com/c++-faq/init-lists.html – hmjd 2013-03-28 10:57:23

+0

看到這個答案... http://stackoverflow.com/questions/13894415/c-creating-objects-initialization-名單-VS-分配 – Caribou 2013-03-28 11:00:14

回答

14

如果我們執行賦值而不是初始化,會出現什麼問題?

某些類別類型(以及參考和const對象)不能分配;有些不能被默認初始化;有些可能會更昂貴的默認初始化和重新分配比直接初始化。

在test1()構造函數的情況下編譯器是否在內部執行賦值?如果否,那麼這些初始化是如何進行的?

在原始類型如int的情況下,兩者之間幾乎沒有實際區別。默認初始化什麼都不做,直接初始化和賦值都做基本相同的事情。

在類類型的情況下,默認初始化,賦值和直接初始化各自調用不同的用戶定義函數,有些操作根本不存在;所以通常這兩個例子可能會有非常不同的行爲。

9

對於你的例子,沒有真正的不同,因爲你正在初始化普通整數。

但假設這些整數都是對象與構造函數,那麼編譯器會生成以下電話:

// test1 
a::copy_constructor(0); 
b::copy_constructor(0); 


// test2 
a::default_constructor(); 
b::default_constructor(); 
a::operator = (0); 
b::operator = (0); 

所以這取決於你的對象test2的可以有一個巨大的性能影響。通過在初始化列表中初始化對象,保證在輸入構造函數時變量具有數據。初始化程序列表的一個「缺點」是它按變量聲明的順序執行,而不是按照初始化程序列表的順序執行,所以可能不需要使用初始化程序列表。