歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++之static靜態修飾符詳解

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

日期:2017/3/1 10:07:47   编辑:Linux編程

•靜態類成員:是那些與類本身有關的成員數據和成員函數,而不是與該類對象相關的成員數據和成員函數。

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

例1:

  1. class Test{
  2. public:
  3. static int k;
  4. Test(int a):k(a){
  5. }
  6. };
  7. //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);

  1. class Test{
  2. public:
  3. static const int a = 10;
  4. static int k;
  5. };
  6. int Test::k;
  7. int main(){
  8. cout << Test::k << endl;
  9. cout << Test::a;
  10. return 0;
  11. }

•在inline函數裡不要使用靜態成員數據,因為編譯器不能保證此時靜態成員數據已初始化。

  1. class Test{
  2. public:
  3. static const int a = 10;
  4. static int k;
  5. void f(){
  6. k++;
  7. }
  8. };
  9. int Test::k(20);
  10. int main(){
  11. Test t;
  12. t.f();
  13. cout << Test::k;
  14. return 0;
  15. }

•靜態成員數據與全局變量的比較:靜態成員數據不論類由多少實例,它都只有一個拷貝,這和全局變量類似。但靜態成員數據有個作用域名字,而且不一定是public的。

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

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

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

在類裡對其初始化。

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

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

Copyright © Linux教程網 All Rights Reserved