歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++中static關鍵字總結

C++中static關鍵字總結

日期:2017/3/1 9:43:18   编辑:Linux編程

static存在的意義:

函數內部定義的變量,在程序執行到它的定義處時,編譯器為它在棧上分配空間,大家知道,函數在棧上分配的空間在此函數執行結束時會釋放掉,這樣就產生了一個問題: 如果想將函數中此變量的值保存至下一次調用時,如何實現? 最容易想到的方法是定義一個全局的變量,但定義為一個全局變量有許多缺點,最明顯的缺點是破壞了此變量的訪問范圍(使得在此函數中定義的變量,不僅僅受此函數控制)。

static的聲明與定義:

靜態數據成員要實際地分配空間,故不能在類的聲明中定義(只能聲明數據成員)。類聲明只聲明一個類的“尺寸和規格”,並不進行實際的內存分配,所以在類聲明中寫成定義是錯誤的。它也不能在頭文件中類聲明的外部定義,因為那會造成在多個使用該類的源文件中,對其重復定義。

static被引入以告知編譯器,將變量存儲在程序的靜態存儲區而非棧上空間,靜態數據成員按定義出現的先後順序依次初始化,注意靜態成員嵌套時,要保證所嵌套的成員已經初始化了。消除時的順序是初始化的反順序。

static使用時注意事項:

1. 當在類的外部定義static成員函數時,不需要重復指定static保留字,只出現在類定義體內部的聲明處;

2. static成員是類的組成部分,但不是任何對象的組成部分;因此,static成員函數沒有this指針。同時不能被聲明為const,因為將成員函數聲明為const就是承諾不會修改該函數所屬的對象。;也不能被聲明為virtual函數。

3. static數據成員必須在類定義體的外部定義。而不是通過構造函數初始化,一般在類成員實現文件中初始化;

4. 類的static成員,以及普通數據成員,不能在類的定義體中初始化!除了常量const!

5. const static 與 static const沒有差別!

6. static數據成員的類型可以是該成員所屬的類類型,同樣是因為static數據成員不屬於任何一個對象,在分配大小時,不需要考慮自身,考慮自身會出現死循環而導致出錯。非static成員被限定聲明為其自身類對象的指針或引用;

如:

class A
{
private:
static A a1; // OK
A * a2; // OK
A a3; // Wrong
}

7. static局部變量在程序執行第一次通過定義初始化,在程序結束前都不會被撤銷。

8. 由於靜態成員聲明於類中,操作於其外,所以對其取地址操作,就多少有些特殊,變量地址是指向其數據類型的指針 ,函數地址類型是一個“nonmember函數指針”。由於靜態成員函數沒有this指針,所以就差不多等同於nonmember函數,結果就產生了一個意想不到的好處:成為一個callback函數,使得我們得以將C++和C-based X Window系統結合,同時也成功的應用於線程函數身上。 http://www.linuxidc.com/Linux/2014-06/102932.htm 中有些例子可以幫助理解回調函數。

-------------------------------------------------------------

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

C++11 獲取系統時間庫函數 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htm

C++11中正則表達式測試 http://www.linuxidc.com/Linux/2012-08/69086.htm

----------------------------------------------------------------------------

添加內容:

靜態全局變量也具有全局作用域,它與全局變量的區別在於如果程序包含多個文件的話,它作用於定義它的文件裡,不能作用到其它文件裡,即被static關鍵字修飾過的變量具有文件作用域。這樣即使兩個不同的源文件都定義了相同名字的靜態全局變量,它們也是不同的變量。

Copyright © Linux教程網 All Rights Reserved