2015-12-24 301 views
0

在C類中的類的數據成員++,我們可以提供默認的構造以及任何無參數constructors.If的,我們使用一個構造函數初始列表中的每個參數的構造函數,則心不是它像我們是初始化成員不止一次?這個概念是否有效?(我認爲我們只能初始化一次)。 另外,通過這樣的邏輯,如果我們有一個恆定的數據成員或參考,如果我想初始化與由用戶所提供的值,我怎樣才能做到這一點的恆定?我發現在C代碼片段++引物,它看起來像初始化在C++

class constref 
    { 
    public: 
     constref(int ii):i(ii),ci(ii),ri(i) 
     { 
     } 
    private: 
     int i; 
     const int ci; 
     int &ri; 
} 

心不是上面的代碼wrong.because因爲我們已經提供了一種構造帶參數,我們需要定義默認constructor.So恆定和被初始化兩次這是我的error.How可以將其作爲參考工作? 感謝

但是你能告訴什麼是這個代碼發生了什麼?

#include<iostream> 
#include<stdlib.h> 
using namespace std; 

class dummy 
{ 
    int a; 
public: 
     dummy():a(0) 
     { 
     } 
     dummy(int i):a(i) 
     { 
     } 
     void output() 
     { 
     cout<<a<<endl; 
     } 
    }; 
    int main() 
    { 
    dummy d; 
    d=dummy(4); 
    d=dummy(3); 
    d.output(); 
    return 0; 
    } 

回答

3

多個構造函數提供了多種初始化對象及其成員的方法。當一個對象被創建時使用了一個的構造函數,所以只有一個初始化。根據創建對象時給出的參數來選擇構造函數。

從示例中,constref c(3);使用構造函數創建對象c,將值3傳遞給構造函數。如果類也定義了一個默認的構造函數,會發生同樣的情況。默認構造函數的存在不會影響c的創建,因爲默認構造函數不帶任何參數,所以不能用3作爲參數來調用。

1

首先,這是沒有必要提供默認構造函數,但如果你不提供,你不能創造這樣constref c1;對象,或者你甚至不能創建對象的數組像constref c1[10]。唯一的方式,你可以創建的對象class constref通過提供整數參數給構造函數即constref c1(10);。第二,常量和引用在你的代碼中沒有初始化兩次,它們只被初始化一次,即interget「i:用」ii「初始化,常量int」ci「再次用」ii「初始化,類似於」裏」。

請注意常量數據成員和引用必須初始化列表否則會被編譯器標記。

此外,在數據成員初始化的順序是完全依賴於它們聲明的方式在類(不在它們出現在初始化列表中的方式)。 考慮以下兩種不同的情況: Scenario1:

class constref 
{ 
    public: 
     constref(int ii):i(ii),ci(ii),ri(i) 
     { 
     } 
    private: 
     int i; 
     const int ci; 
     int &ri; 
} 

在這裏,我將首先初始化,然後CI和RI。

scenario2:

class constref 
{ 
    public: 
     constref(int ii):i(ii),ci(ii),ri(i) 
     { 
     } 
    private: 
     const int ci; 
     int i; 
     int &ri; 
} 

這裏CI將首先初始化,其次是我,RI。

1

沒有衝突:初始化器列表可以與空的{ }主體一起使用,或者與帶有語句的構造器主體一起使用。

初始化程序列表將剛剛初始化構造函數的開始處的特定值的成員。

即使一個構造函數有一個初始化列表,你仍然可以用來完成構造函數體中的其他工作。

此:

Point(int i = 0, int j = 0):x(i), y(j) {} 

等效於此:

Point(int i = 0, int j = 0) { 
     x = i; 
     y = j; 
    } 

你只會有不同的構造方法,如果不同的變量數字被傳遞到構造函數初始化類。任何帶參數的構造函數都可以使用初始化器列表。


默認構造函數是不帶任何參數的構造函數。

只需要在不需要任何參數的情況下實例化類的對象的情況下,您只需定義一個默認構造函數。

參考文獻:

http://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/

https://en.wikipedia.org/wiki/Default_constructor