特殊數據類型成員變量的初始化

有些成員變量的數據類型比較特別,它們的初始化方式也和普通數據類型的成員變量有所不同。這些特殊的類型的成員變量包括:

a.       常量型成員變量

b.       引用型成員變量

c.        靜態成員變量

d.       整型靜態常量成員變量

e.       非整型靜態常量成員變量

 

對於常量型成員變量和引用型成員變量的初始化,必須通過構造函數初始化列表的方式進行。在構造函數體內給常量型成員變量和引用型成員變量賦值的方式是行不通的。

 

靜態成員變量的初始化也頗有點特別。

 

參考下面的代碼以及其中註釋:

// Initialization of Special Data Member

#include <iostream>

using namespace std;

 

class BClass

{

public:

         BClass() : i(1), ci(2), ri(i)   // 對於常量型成員變量和引用型成員變量,必須通過

         {                                             // 參數化列表的方式進行初始化。在構造函數體內進

         }                                             // 行賦值的方式,是行不通的。

 

         void print_values()

         {

                   cout << "i =\t" << i << endl;

                   cout << "ci =\t" << ci << endl;

                   cout << "ri =\t" << ri << endl;

                   cout << "si =\t" << si << endl;

                   cout << "csi =\t" << csi << endl;

                  cout << "csi2 =\t" << csi2 << endl;

                   cout << "csd =\t" << csd << endl;

         }

private:

         int i;                                                          // 普通成員變量

         const int ci;                                             // 常量成員變量

         int &ri;                                                      // 引用成員變量

         static int si;                                             // 靜態成員變量

         //static int si2 = 100;                             // error: 只有靜態常量成員變量,纔可以這樣初始化

         static const int csi;                                // 靜態常量成員變量

         static const int csi2 = 100;                   // 靜態常量成員變量的初始化(Integral type)    (1)

         static const double csd;                      // 靜態常量成員變量(non-Integral type)

         //static const double csd2 = 99.9;      // error: 只有靜態常量整型數據成員纔可以在類中初始化

};

 

// 靜態成員變量的初始化(Integral type)

int BClass::si = 0;

// 靜態常量成員變量的初始化(Integral type)

const int BClass::csi = 1;

// 靜態常量成員變量的初始化(non-Integral type)

const double BClass::csd = 99.9;

 

// 在初始化(1)中的csi2時,根據Stanley B. Lippman的說法下面這行是必須的。

// 但在VC2003中如果有下面一行將會產生錯誤,而在VC2005中,下面這行則可有可無,這個和編譯器有關。

const int BClass::csi2;

 

int main(void)

{

         BClass b_class;

         b_class.print_values();

 

         return 0;

}


轉載自:http://patmusing.blog.163.com/blog/static/13583496020101814811570/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章