C++ static const成員 初始化


const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函數執行後不會釋放其存儲空間。

      static表示的是靜態的。類的靜態成員函數、靜態成員變量是和類相關的,而不是和類的具體對象相關的。即使沒有具體對象,也能調用類的靜態成員函數和成員變量。一般類的靜態函數幾乎就是一個全局函數,只不過它的作用域限於包含它的文件中。

      在C++中,static靜態成員變量不能在類的內部初始化。在類的內部只是聲明,定義必須在類定義體的外部,通常在類的實現文件中初始化,如:double Account::Rate=2.25;static關鍵字只能用於類定義體內部的聲明中,定義時不能標示爲static

      在C++中,const成員變量也不能在類定義處初始化,只能通過構造函數初始化列表進行,並且必須有構造函數。

      const數據成員 只在某個對象生存期內是常量,而對於整個類而言卻是可變的因爲類可以創建多個對象,不同的對象其const數據成員的值可以不同。所以不能在類的聲明中初始化const數據成員,因爲類的對象沒被創建時,編譯器不知道const數據成員的值是什麼。

      const數據成員的初始化只能在類的構造函數的初始化列表中進行。要想建立在整個類中都恆定的常量,應該用類中的枚舉常量來實現,或者static cosnt。


-----------------Test.h----------------------------

#pragma once

class Test
{
private :
      int var1;
// int var11= 4; 錯誤的初始化方法
      const int var2 ;
// const int var22 =22222; 錯誤的初始化方法
      static int var3;
// static int var3333=33333; 錯誤,只有靜態常量成員才能直接賦值來初始化
      static const int var4=4444; //正確,靜態常量成員可以直接初始化
      static const int var44;
public:
      Test(void);
       ~Test(void);
};
--------------------Test.cpp-----------------------------------

#include ".\test.h"

int Test::var3 = 3333333; //靜態成員的 正確的初始化方法

// int Test::var1 = 11111;; 錯誤 靜態成員才能初始化
// int Test::var2 = 22222; 錯誤
// int Test::var44 = 44444; // 錯誤的方法,提示重定義
Test::Test(void) :var1(11111),var2(22222) //正確的初始化方法 , var3(33333) 不能在這裏初始化
{
          var1 =11111; //正確, 普通變量也可以在這裏初始化
          //var2 = 222222; 錯誤,因爲常量不能賦值,只能在 “constructor initializer (構造函數的初始化列表)” 那裏初始化
          
    var3 =44444; //這個賦值時正確的,不過因爲所有對象一個靜態成員,所以會影響到其他的,這不能叫做初始化了吧
}

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

    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;


鏈接:http://www.douban.com/note/66957147/

http://blog.csdn.net/yjkwf/article/details/6067267




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