1. 程式人生 > >static和const區別?

static和const區別?

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

      static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具體物件相關的。即使沒有具體物件,也能呼叫類的靜態成員函式和成員變數。一般類的靜態函式幾乎就是一個全域性函式,只不過它的作用域限於包含它的檔案中。

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

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

      const資料成員 只在某個物件生存期內是常量,而對於整個類而言卻是可變的。因為類可以建立多個物件,不同的物件其const資料成員的值可以不同。所以不能在類的宣告中初始化const資料成員,因為類的物件沒被建立時,編譯器不知道const資料成員的值是什麼。

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

  1. class Test  
  2. {  
  3. public:  
  4.       Test():a(0){}  
  5.       enum {size1=100,size2=200};  
  6. private:  
  7.       const int a;//只能在建構函式初始化列表中初始化  
  8.        static int b;//在類的實現檔案中定義並初始化  
  9.       const static int c;//與 static const int c;相同。  
  10. };  
  11. int Test::b=0;//static成員變數不能在建構函式初始化列表中初始化,因為它不屬於某個物件。  
  12. cosnt int Test::c=0;//注意:給靜態成員變數賦值時,不需要加static修飾符。但要加cosnt  

      cosnt成員函式主要目的是防止成員函式修改物件的內容。即const成員函式不能修改成員變數的值,但可以訪問成員變數。當方法成員函式時,該函式只能是const成員函式。

      static成員函式主要目的是作為類作用域的全域性函式。不能訪問類的非靜態資料成員。類的靜態成員函式沒有this指標,這導致:1、不能直接存取類的非靜態成員變數,呼叫非靜態成員函式2、不能被宣告為virtual

關於static、const、static cosnt、const static成員的初始化問題:

1、類裡的const成員初始化:

在一個類裡建立一個const時,不能給他初值

  1. class foo  
  2. {  
  3. public:  
  4.       foo():i(100){}  
  5. private:  
  6.       const int i=100;//error!!!  
  7. };  
  8. //或者通過這樣的方式來進行初始化  
  9. foo::foo():i(100)  
  10. {}  

2、類裡的static成員初始化:

      類中的static變數是屬於類的,不屬於某個物件,它在整個程式的執行過程中只有一個副本,因此不能在定義物件時 對變數進行初始化,就是不能用建構函式進行初始化,其正確的初始化方法是:

資料型別 類名::靜態資料成員名=值;

  1. class foo  
  2. {  
  3. public:  
  4.       foo();  
  5. private:  
  6.       static int i;  
  7. };  
  8. int foo::i=20;  
  9. 這表明:  
  10. 1、初始化在類體外進行,而前面不加static,以免與一般靜態變數或物件相混淆  
  11. 2、初始化時不加該成員的訪問許可權控制符private、public等  
  12. 3、初始化時使用作用域運算子來表明它所屬的類,因此,靜態資料成員是類的成員而不是物件的成員。  

3、類裡的static cosnt 和 const static成員初始化

      這兩種寫法的作用一樣,為了便於記憶,在此值說明一種通用的初始化方法:

  1. class Test  
  2. {  
  3. public:  
  4.       static const int mask1;  
  5.       const static int mask2;  
  6. };  
  7. const Test::mask1=0xffff;  
  8. const Test::mask2=0xffff;  
  9. //它們的初始化沒有區別,雖然一個是靜態常量一個是常量靜態。靜態都將儲存在全域性變數區域,其實最後結果都一樣。可能在不同編譯器內,不同處理,但最後結果都一樣。  

這是一個完整的例子:

  1. #ifdef A_H_  
  2. #define A_H_  
  3. #include <iostream>  
  4. using namespace std;  
  5. class A  
  6. {  
  7. public:  
  8.       A(int a);  
  9.       static void print();//靜態成員函式  
  10. private:  
  11.       static int aa;//靜態資料成員的宣告  
  12.        static const int count;//常量靜態資料成員(可以在建構函式中初始化)  
  13.        const int bb;//常量資料成員  
  14. };  
  15. int A::aa=0;//靜態成員的定義+初始化  
  16. const int A::count=25;//靜態常量成員定義+初始化  
  17. A::A(int a):bb(a)//常量成員的初始化  
  18. {  
  19.       aa+=1;  
  20. }  
  21. void A::print()  
  22. {  
  23.       cout<<"count="<<count<<endl;  
  24.       cout<<"aa="<<aa<<endl;  
  25. }  
  26. #endif  
  27. void main()  
  28. {  
  29.       A a(10);  
  30.       A::print();//通過類訪問靜態成員函式  
  31.       a.print();//通過物件訪問靜態成員函式  
  32. }  

相關推薦

staticconst區別

const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函式執行後不會釋放其儲存空間。      static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具體物件相關的。即使沒有具體物件,也能呼叫類的靜態成員函式和成員變

staticconst區別用處

const總結 1.常物件:const 類名 物件名[()] 例如const Cdate d1(2008,8,8) d1就是常物件,物件d1中的所有成員的值都不能被修改,定義常物件必須要有初值,不能做左值,如果定義了常物件,則不能呼叫該物件的非const成員函式,只能訪

static const區別與聯絡

static 是c++中非常常用的修飾符,他被用來控制變數的儲存方式和可見性,下面我將從 static 修飾符的產生原因、作用談起,全方面分析static 修飾符的實質。 static 的兩大作用:一、控制儲存方式:  static被引入以告知編譯器,將變數儲存在程式的靜態

小胖說事28------iOS中extern,staticconst差別使用方法

方法 string 文件 only 聲明 sans nbsp ring const 通俗的講: extern字段使用的時候,聲明的變量為全局變量,都能夠調用,也有這樣一種比較狹義的說法:extern能夠擴展一個類中的變量到還有一個類中;

2018/03/07 每日一學PHP 之 常量defind const區別

報錯 問題 條件語句 const 識別 是否 定義 運行 fin   什麽是常量?     如字面理解的,在腳本執行期間不可改變的的量。   定義一個常量應該註意的事項?     1:常量默認大小寫敏感,錯誤的大小寫不會被識別為常量。     2:常量只能是標量數據,也可

staticconst

類型 成員函數 指針數組 聲明 如果 com 不能 sta 訪問 http://www.cnblogs.com/afreeman/p/8463227.html 引用 引用是變量的別名。變量類型 &引用名 = 變量。 1,引用定義時必須初始化,引用初始化後不能再改變其

staticconst的作用

static的作用 一、對變數 1、區域性變數 在區域性變數之前加上關鍵字static,區域性變數就被定義成為一個區域性靜態變數。 1)記憶體中的位置:靜態儲存區 2)初始化:未經初始化的全域性靜態變數會被程式自動初始化為0(自動物件的值是任意的,除非他被顯示初

PHP面向物件(OOP):.staticconst關鍵字的使用(self::)

static關鍵字是在類中描述成員屬性和成員方法是靜態的;靜態的成員好 處在哪裡呢?前面我們聲明瞭“Person”的人類,在“Person”這個類裡如果我們加上一個“人所屬國家”的屬性,這樣用“Person”這個類實 例化出幾百個或者更多個例項物件,每個物件裡面就都有“所屬國

c/c++中關鍵字staticconst的用法

一、static 1.在函式體一個被宣告為靜態的變數在這一函式被呼叫的過程中維持其值不變; 2.在模組內,一個被宣告為變數可以被模組內所用,函式訪問,但不能被模組外其他函式訪問,它是一個本地全域性變數; 3.在模組外,一個被宣告為靜態的函式只可被這一模組內的其他函式呼叫,那

C/C++中staticconst關鍵字的作用總結

static 關鍵字至少有下列 n 個作用:   (1)函式體內 static 變數的作用範圍為該函式體,不同於auto 變數,該變數的記憶體只被分配一次,因此其值在下次呼叫時仍維持上次的值;   (

【C語言】C語言staticextern區別

目錄: 【static】 【extern】 1.static · 定義一個內部函式/變數。 · 宣告一個內部函式/變數。 2.extern · 定義一個外部函式/變數。 · 宣告一個外

C++中staticconst關鍵字的作用

修飾 程序 一次 sta 聲明 必須 bsp 進行 函數調用 static 1.static聲明的變量內存只被分配一次。auto變量(局部變量)在棧內存區堆放,static變量存放於數據區,程序結束才會釋放。 2.模塊內聲明的static全局變量,可以被該模塊所有函數訪

JS中const、varlet區別

方法 pre 命令 con 使用 它的 comm 作用 影響 在JavaScript中有三種聲明變量的方式:var、let、const。 1.const 聲明創建一個只讀的常量。這不意味著常量指向的值不可變,而是變量標識符的值只能賦值一次,必須初始化。 const b

區別readonlyconst的使用方法

沒有 字符串類型 區別 只讀 不能 類型 枚舉類 修飾符 一點 const和readonly的本質區別: 1.const是一個編譯期常量,readonly是一個運行時常量。 2.const只能修飾基元類型、枚舉類型或字符串類型,readonly則沒有限制。 關於第一點,

PHP中new static() new self() 的區別

pub 堆內存 func sel urn ret 通過 ati php self 指的是self所在的類 new static 實例化的是當前使用的類,有點像$this ,從堆內存中提取出來。 還是通過實例說明一下: class A { public static f

PHP 面向對象中常見關鍵字使用(final、staticconstinstanceof)

對象的引用 符號 存在 stat true 函數 php 面向對象 his 對象引用 PHP 面向對象中常見關鍵字的使用:   1、final :final關鍵字可以加在類或者類中方法之前,但是不能使用final標識成員屬性。     作用: 使用final標識的類,不能被

C# readonlyconst區別

const常量 需要 pad 性能 table adk ide itl common 什麽是靜態常量(Const)和動態常量(Readonly)   先解釋下什麽是靜態常量(Const)以及什麽是動態常量(Readonly)。  靜態常量(Const)是指編譯器在編

staticextern的使用區別

col color 不可訪問 全局 結束 改變 初始 font spa 1. static: 局部:只會初始化一次,內存只有一份內存;改變不了局部變量的作用域但可延長其生命周期至程序結束才被銷毀。 全局:僅限於當前文件的作用域,外部

php中staticself調用靜態方法區別

php由於看到框架裏面經常使用static::method() 於是稍微了解下static和self的區別廢話少說,直接上代碼class Father { public function __construct() { $this->init(); self::test(); }

類鎖對象鎖,synchronized修飾static方法與非static方法的區別

ati nbsp 的區別 一個 靜態方法 範圍 之間 對象 ron 當synchronized修飾一個static方法時,多線程下,獲取的是類鎖(即Class本身,註意:不是實例), 作用範圍是整個靜態方法,作用的對象是這個類的所有對象。 當synchro