2016-01-11 45 views
1

爲什麼你必須在構造函數中初始化對象數據成員,並且不能像初始類型那樣使用默認值初始化它們?是否有可能使用原始類型對它們進行初始化?默認初始化是對象的數據成員?

下面是一個例子:

class foo { 
    int a; 
public: 
    foo(int _a) :a(_a) {}; 
}; 

class bar { 
    string a = "asdf";//no error 
    int num = 1;//no error 
    foo x(1); //error, why? 
    foo z; 
public: 
    bar(): z(1){}//no error 
}; 
+0

由於禁止文字,這是幾乎相同的功能定義,並同時支持會使語言的語法更加複雜。爲什麼當你有兩種更可讀的方式來實現相同的目標? – StoryTeller

+0

如果使用標識符而不是文字 - 'foo x(baz);' - 自從時間開始以來它就是成員函數的聲明。無論是函數還是變量,取決於範圍中的「baz」是一個類型還是一個變量都是導致瘋狂的一條路徑。 – molbdnilo

回答

5

在一流的初始化僅與operator=語法或用大括號初始化列表工作,而不是用函數風格的初始化。因此,而不是

foo x{1}; 

foo x(1); 

應該做的伎倆。

在你的情況,你也可以使用

foo x = 1; 

但是這將打破,如果foo的構造採取單一intexplicit

2

行政法規類定義direct-initialization會導致難以從函數聲明區分:

考慮:

struct k; 

struct foo { foo(int x = 1){} }; 

class toto 
{ 
static constexpr int k = 1; 
foo x(1); // hm might be ok... 
foo y(); // hm ... NOK , what y is ? an object or a function declaration?!?! 
foo z(k); // problem .... this seems a fucntion definition?!!! 
foo z{k}; // clear it is not a function definition 
}; 

正確的方式做,這有兩種情況:

foo f= 1; 

foo f{1}; 

foo f = {1}; 
相關問題