2012-04-05 80 views
4

考慮這種構造:Packet() : bits_(0), datalen_(0), next_(0) {}C++構造瞭解

注意bits_datalen_next_在類分組字段定義如下:

u_char* bits_; 
u_int datalen_; 
Packet* next_; 

是什麼構造,這部分是什麼意思? bits_(0), datalen_(0), next_(0)

回答

6

這是一個初始化列表,它將值設置爲指定的值。

Packet() : bits_(0), datalen_(0), next_(0) 
{ 
    assert(bits_ == 0); 
    assert(datalen_ == 0); 
    assert(next_ == 0); 
} 
//... 
Packet() 
{ 
    //bits_ , datalen_, next_ uninitialized here 
} 

一些成員(const會員或用戶定義的類成員沒有默認構造函數)不能在初始化列表之外進行初始化:

class A 
{ 
    const int x; 
    A() { x = 0; } //illegal 
}; 

class A 
{ 
    const int x; 
    A() : x(0) { } //legal 
}; 

另外值得一提的是,雙初始化不會使用這種技術發生:

class B 
{ 
public: 
    B() { cout << "default "; } 
    B(int) { cout << "b"; } 
}; 

class A 
{ 
    B b; 
    A() { b = B(1); } // b is initialized twice - output "default b" 
    A() : b(1) { }  // b initialized only once - output "b" 
}; 

這是初始化成員的優先方式。

+0

雅我猜測一樣 - 但我想知道做這件事的技術名稱,以便我可以閱讀更多關於它。謝謝:) – vigs1990 2012-04-05 11:18:00

+0

初始化列表。 – 2012-04-05 11:20:30

+0

@Luchian Grigore什麼是雙重初始化? – vigs1990 2012-04-05 11:21:58

2

它被稱爲初始值設定項列表,它使用括號中指定的值初始化字段。下面將達到同樣的效果到底:

Packet() 
{ 
    bits_ = nullptr; // or 0 or NULL pre-C++11 
    datalen_ = 0; 
    next_ = nullptr; 
} 

不同的是,在我的例子中,你正在做分配,領域就已經被他們的默認構造函數來構建。

對於沒有默認構造函數的用戶定義類型,初始化程序列表是唯一的方法,因爲您需要爲構造函數提供一些參數。

+0

在他的特殊情況下,是的,但對於用戶定義的數據成員,它是完全不同的,可能想指出。 – 2012-04-05 11:19:40

+0

@LuchianGrigore完成。 – jrok 2012-04-05 11:23:11

3

這意味着第一bits_,然後datalen_最後next_將收到的0即值下面2個代碼片段是完全等效的:

Packet() 
    : bits_(0) 
    , datalen_0) 
    , next_(0) 
{ 
} 

和此:

Packet() 
{ 
    bits_ = 0; 
    datalen_ = 0; 
    next_ = 0; 
} 

當心,雖然。初始化順序由成員聲明順序決定。即因爲本來預計有下面的代碼將無法正常工作:

struct Packet 
{ 
    int first; 
    int second; 

    Packet() 
     : second(0) 
     , first(second) 
    { 
    } 
}; 

這將是相同的:

struct Packet 
{ 
    int first; 
    int second; 

    Packet() 
    { 
     first = second; 
    second = 0; 
    } 
}; 

所以第二將獲得0,但第一不會