C++之static靜態修飾符詳解

來源:互聯網
上載者:User
•靜態類成員:是那些與類本身有關的成員資料和成員函數,而不是與該類對象相關的成員資料和成員函數。

  所以靜態成員資料也稱為類資料,靜態成員函數也稱為類方法。靜態成員資料在類裡只是一個說明,還需要一個定義(或叫初始化)。靜態成員資料要在類定義之外被初始化(要用類名限定修飾),而且程式裡只能提供一次,所以初始化不能放在標頭檔裡。

例1:

class Test{public:static int k;Test(int a):k(a){  //編譯錯誤!!!}};

 //error: 'int Test::k' is a static data member; it can only be initialized at its definition

例2:

C++規定const靜態類成員可以直接初始化,其他非const的靜態類成員需要在類聲明以外初始化,我們一般選擇在類的實現檔案中初始化。

int Test::k;

預設初始化為0;

也可自己指定:

int Test::k(20);

class Test{public:static const int a = 10; static int k;};int Test::k;int main(){cout << Test::k << endl;cout << Test::a;return 0;}


•在inline函數裡不要使用靜態成員資料,因為編譯器不能保證此時靜態成員資料已初始化。
class Test{public:static const int a = 10;static int k;void f(){k++;}};int Test::k(20);int main(){Test t;t.f();cout << Test::k;return 0;}

class A{public:A(A & e):_e3(e){}A & _e3;A * _e1;static A _e; A _e2;  // error C2460: '_e2' : uses 'A', which is being defined   };

•靜態成員資料與全域變數的比較:靜態成員資料不論類由多少執行個體,它都只有一個拷貝,這和全域變數類似。但靜態成員資料有個範圍名字,而且不一定是public的。

•靜態成員函數不能聲明為const和volatile。

•靜態成員函數和友元函數比較:靜態成員函數和友元函數都沒有隱含的this指標,且都能訪問類的private和protected部分。但靜態成員函數有個範圍名字,而且不一定是public的。

•const靜態成員資料:在有些C++編譯器裡,有序型的(如int,unsignedlong,char等)const靜態成員資料可以

  在類裡對其初始化。

•靜態成員資料初始化次序:靜態初始化成員資料次序和類範圍的靜態對象、檔案範圍和名字空間範圍的對象的生存周期有關。當在不同編譯單元(即.cpp檔案)的靜態初始化有次序依賴,這就有可能有危險。解決的辦法將靜態成員資料轉換為靜態成員函數。

•volatile:當一個對象的值可能會在編譯器的控制或監視之外被改變,那該對象應該聲明為volatile。
此時編譯器執行的一些例行最佳化對它不能應用。volatile也可以修飾類成員函數。對於volatile類對象它只能調用volatile成員函數、建構函式和解構函式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.