2011-04-17 236 views
9

我被士丹利李普曼閱讀C++底漆第4版,我92頁約值初始化上。C++值初始化

我只是不約值初始化時理解。我瀏覽過,我知道也有默認初始化和零初始化。任何人都可以解釋價值初始化?

來到這一段..

子句)

「有些類沒有定義默認 構造函數。我們不能指定 只有大小初始化這種類型的 載體,我們還必須指定一個 的初始值「

我明白上面的內容,但我發現下面的內容與ab相矛盾Ove句子。

子句B)

「元素類型可能是一個類類型 沒有定義任何構造的。 在這種情況下,庫仍然 產生一個值初始化的對象,它 這樣做通過價值初始化該對象的每個 成員「

我不明白b條款。

任何幫助理解

回答

8

一)這是真實的,如果類定義其他構造 - 從而抑制一個默認的構造的產生。

struct Foo { 
    Foo(int n) : mem(n) {} 
    int mem; 
}; 

該類不能進行值初始化。

b)如果類具有沒有構造限定值初始化將簡單值初始化所有子對象(基類和非靜態成員)的Bar

struct Foo { 
    Foo() : mem(0) {} 
    int mem; 
}; 

struct Bar { 
    Foo f; 
}; 

價值初始化簡單地意味着f成員將進行值初始化。

參見例如What do the following phrases mean in C++: zero-, default- and value-initialization?

+0

你能不能給我根據條款B一些示例)? – yapkm01 2011-04-18 00:10:11

+0

@ yapmk01:用一些示例更新了答案 – Erik 2011-04-18 00:17:21

+0

我是C++新手。我來自Java背景。 b)你提到的Foo():mem(0){} ..不是Foo()的默認構造函數嗎?在Java中,默認構造函數是沒有任何參數的構造函數。C++類可以根本沒有構造函數(也就是說沒有默認的構造函數)?從我的理解。如果你不提供任何構造函數,編譯器會爲你生成默認的構造函數。如果C++類可以根本沒有構造器,那麼你如何初始化它? – yapkm01 2011-04-18 02:42:26

0
#include <vector> 
#include <string> 
class fooz { 
    private: 
     string s; 
     int n; 
    public: 
     fooz(string& str, int num) { 
      s=str; 
      n=num; 
     } 
     ~fooz(){} 
     void gets(string& str) {str=s;} 
     void getn(int& num) {num=n;} 
}; 
vector<class fooz> vfDialpad = { 
    fooz(string(""),0), 
    fooz(string(""),1), 
    fooz(string("abc"),2), 
    fooz(string("def"),3), 
    fooz(string("ghi"),4), 
    fooz(string("jkl"),5), 
    fooz(string("mno"),6), 
    fooz(string("pqrs"),7), 
    fooz(string("tuv"),8), 
    fooz(string("wxyz"),9) 
}; 

此後,兩條規則都已被激活。這是一個初始化器列表,它對C++來說是新的,你可能會或可能不會在新版本的gcc中找到它。每個元素獲取初始化的新對象。

也許我不是在最好的例子在這裏,但它是一個開始。