const 定義的常量在超出其作用域之后其空間會被釋放,而 static 定義的靜態(tài)常量在函數(shù)執(zhí)行后不會釋放其存儲空間。
static 表示的是靜態(tài)的。類的靜態(tài)成員函數(shù)、靜態(tài)成員變量是和類相關(guān)的,而不是和類的具體對象相關(guān)的。即使沒有具體對象,也能調(diào)用類的靜態(tài)成員函數(shù)和成員變量。一般類的靜態(tài)函數(shù)幾乎就是一個全局函數(shù),只不過它的作用域限于包含它的文件中。
在 C++ 中,static 靜態(tài)成員變量不能在類的內(nèi)部初始化。在類的內(nèi)部只是聲明,定義必須在類定義體的外部,通常在類的實(shí)現(xiàn)文件中初始化,如:double Account::Rate = 2.25;
static 關(guān)鍵字只能用于類定義體內(nèi)部的聲明中,定義時不能標(biāo)示為 static。
在 C++ 中,const 成員變量也不能在類定義處初始化,只能通過構(gòu)造函數(shù)初始化列表進(jìn)行,并且必須有構(gòu)造函數(shù)。
const 數(shù)據(jù)成員 只在某個對象生存期內(nèi)是常量,而對于整個類而言卻是可變的。因?yàn)轭惪梢詣?chuàng)建多個對象,不同的對象其 const 數(shù)據(jù)成員的值可以不同。所以不能在類的聲明中初始化 const 數(shù)據(jù)成員,因?yàn)轭惖膶ο鬀]被創(chuàng)建時,編譯器不知道 const 數(shù)據(jù)成員的值是什么。
const 數(shù)據(jù)成員的初始化只能在類的構(gòu)造函數(shù)的初始化列表中進(jìn)行。要想建立在整個類中都恒定的常量,應(yīng)該用類中的枚舉常量來實(shí)現(xiàn),或者static cosnt。
cosnt 成員函數(shù)主要目的是防止成員函數(shù)修改對象的內(nèi)容。即 const 成員函數(shù)不能修改成員變量的值,但可以訪問成員變量。當(dāng)方法成員函數(shù)時,該函數(shù)只能是 const 成員函數(shù)。
static 成員函數(shù)主要目的是作為類作用域的全局函數(shù)。不能訪問類的非靜態(tài)數(shù)據(jù)成員。類的靜態(tài)成員函數(shù)沒有 this 指針,這導(dǎo)致:
- 1、不能直接存取類的非靜態(tài)成員變量,調(diào)用非靜態(tài)成員函數(shù)。
- 2、不能被聲明為 virtual。
關(guān)于 static、const、static cosnt、const static 成員的初始化問題
1、類里的const成員初始化:
在一個類里建立一個 const 時,不能給他初值。
2、類里的 static 成員初始化:
類中的 static 變量是屬于類的,不屬于某個對象,它在整個程序的運(yùn)行過程中只有一個副本,因此不能在定義對象時 對變量進(jìn)行初始化,就是不能用構(gòu)造函數(shù)進(jìn)行初始化,其正確的初始化方法是:
數(shù)據(jù)類型 類名::靜態(tài)數(shù)據(jù)成員名=值;
這表明:
- 1、初始化在類體外進(jìn)行,而前面不加static,以免與一般靜態(tài)變量或?qū)ο笙嗷煜?
- 2、初始化時不加該成員的訪問權(quán)限控制符private、public等
3、初始化時使用作用域運(yùn)算符來表明它所屬的類,因此,靜態(tài)數(shù)據(jù)成員是類的成員而不是對象的成員。
3、類里的 static cosnt 和 const static 成員初始化
這兩種寫法的作用一樣,為了便于記憶,在此值說明一種通用的初始化方法:
完整實(shí)例
實(shí)例
初始化位置
靜態(tài)成員不能在類的定義里初始化(除int外)。不能在頭文件里初始化。
比如定義了 myclass.h,一般放到 myclass.cpp 里初始化它。
C++ 類的靜態(tài)成員(static)
靜態(tài)成員的提出是為了解決數(shù)據(jù)共享的問題。實(shí)現(xiàn)共享有許多方法,如:設(shè)置全局性的變量或?qū)ο笫且环N方法。但是,全局變量或?qū)ο笫怯芯窒扌缘?。這一章里,我們主要講述類的靜態(tài)成員來實(shí)現(xiàn)數(shù)據(jù)的共享。
靜態(tài)數(shù)據(jù)成員
在類中,靜態(tài)成員可以實(shí)現(xiàn)多個對象之間的數(shù)據(jù)共享,并且使用靜態(tài)數(shù)據(jù)成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態(tài)成員是類的所有對象中共享的成員,而不是某個對象的成員。
使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存,因?yàn)樗撬袑ο笏械?,因此,對多個對象來說,靜態(tài)數(shù)據(jù)成員只存儲一處,供所有對象共用。靜態(tài)數(shù)據(jù)成員的值對每個對象都是一樣,但它的值是可以更新的。只要對靜態(tài)數(shù)據(jù)成員的值更新一次,保證所有對象存取更新后的相同的值,這樣可以提高時間效率。
靜態(tài)數(shù)據(jù)成員的使用方法和注意事項(xiàng)如下:
1、靜態(tài)數(shù)據(jù)成員在定義或說明時前面加關(guān)鍵字 static。
2、靜態(tài)成員初始化與一般數(shù)據(jù)成員初始化不同。靜態(tài)數(shù)據(jù)成員初始化的格式如下:
<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>
這表明:
- (1) 初始化在類體外進(jìn)行,而前面不加static,以免與一般靜態(tài)變量或?qū)ο笙嗷煜?
- (2) 初始化時不加該成員的訪問權(quán)限控制符private,public等。
- (3) 初始化時使用作用域運(yùn)算符來標(biāo)明它所屬類,因此,靜態(tài)數(shù)據(jù)成員是類的成員,而不是對象的成員。
3、靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲的,它是靜態(tài)生存期,必須對它進(jìn)行初始化。
4、引用靜態(tài)數(shù)據(jù)成員時,采用如下格式:
<類名>::<靜態(tài)成員名>
如果靜態(tài)數(shù)據(jù)成員的訪問權(quán)限允許的話(即public的成員),可在程序中,按上述格式來引用靜態(tài)數(shù)據(jù)成員。
下面舉一例子,說明靜態(tài)數(shù)據(jù)成員的應(yīng)用:
實(shí)例
從輸出結(jié)果可以看到Sum的值對M對象和對N對象都是相等的。這是因?yàn)樵诔跏蓟疢對象時,將M對象的三個int型數(shù)據(jù)成員的值求和后賦給了Sum,于是Sum保存了該值。在初始化N對象時,對將N對象的三個int型數(shù)據(jù)成員的值求和后又加到Sum已有的值上,于是Sum將保存另后的值。所以,不論是通過對象M還是通過對象N來引用的值都是一樣的,即為54。
靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類的靜態(tài)成員,它們都不是對象成員。因此,對靜態(tài)成員的引用不需要用對象名。
在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中不能直接引用類中說明的非靜態(tài)成員,可以引用類中說明的靜態(tài)成員。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時,可通過對象來引用。下面通過例子來說明這一點(diǎn)。
實(shí)例
讀者可以自行分析其結(jié)果。從中可看出,調(diào)用靜態(tài)成員函數(shù)使用如下格式:
<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>);
C++ 中各種類型的成員變量的初始化方法
C++各種不同類型成員根據(jù)是否static、時候const類型的初始化方法不盡相同,java的語法就沒有這么復(fù)雜,怪的得那么多人都跑去學(xué)Java了。以前面試時被人問到這個問題回答不出來,寫代碼時也經(jīng)常搞亂了,這里翻了下書,總結(jié)一下。
有些成員變量的數(shù)據(jù)類型比較特別,它們的初始化方式也和普通數(shù)據(jù)類型的成員變量有所不同。這些特殊的類型的成員變量包括:
- a. 常量型成員變量
- b. 引用型成員變量
- c. 靜態(tài)成員變量
- d. 整型靜態(tài)常量成員變量
- e. 非整型靜態(tài)常量成員變量
對于常量型成員變量和引用型成員變量的初始化,必須通過構(gòu)造函數(shù)初始化列表的方式進(jìn)行。在構(gòu)造函數(shù)體內(nèi)給常量型成員變量和引用型成員變量賦值的方式是行不通的。
靜態(tài)成員變量的初始化也頗有點(diǎn)特別。
參考下面的代碼以及其中注釋:
c++ 靜態(tài)成員小結(jié),c++,static
類中的靜態(tài)成員真是個讓人愛恨交加的特性。我曾經(jīng)在面試時,被主考官抓住這個問題一陣窮追猛打,直把我問的面紅耳赤,敗下陣來。所以回來之
后,我痛定思痛,決定好好總結(jié)一下靜態(tài)類成員的知識點(diǎn),以便自己在以后面試中,在此類問題上不在被動。?
靜態(tài)類成員包括靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員兩部分。?
靜態(tài)數(shù)據(jù)成員
類體中的數(shù)據(jù)成員的聲明前加上static關(guān)鍵字,該數(shù)據(jù)成員就成為了該類的靜態(tài)數(shù)據(jù)成員。和其他數(shù)據(jù)成員一樣,靜態(tài)數(shù)據(jù)成員也遵守public/protected/private訪問規(guī)則。同時,靜態(tài)數(shù)據(jù)成員還具有以下特點(diǎn):?
1.靜態(tài)數(shù)據(jù)成員的定義。?
靜態(tài)數(shù)據(jù)成員實(shí)際上是類域中的全局變量。所以,靜態(tài)數(shù)據(jù)成員的定義(初始化)不應(yīng)該被放在頭文件中。?(聲明vs.定義(初始化)) 其定義方式與全局變量相同。舉例如下:?
注:不要試圖在頭文件中定義(初始化)靜態(tài)數(shù)據(jù)成員。在大多數(shù)的情況下,這樣做會引起重復(fù)定義這樣的錯誤。即使加上#ifndef #define #endif 或者 #pragma once 也不行。?
2.靜態(tài)數(shù)據(jù)成員被類的所有對象所共享,包括該類派生類的對象。即派生類對象與基類對象共享基類的靜態(tài)數(shù)據(jù)成員。舉例如下:?
3.靜態(tài)數(shù)據(jù)成員可以成為成員函數(shù)的可選參數(shù),而普通數(shù)據(jù)成員則不可以。舉例如下:
4.靜態(tài)數(shù)據(jù)成員的類型可以是所屬類的類型,而普通數(shù)據(jù)成員則不可以。普通數(shù)據(jù)成員的只能聲明為所屬類類型的指針或引用。舉例如下:
5.這個特性,我不知道是屬于標(biāo)準(zhǔn)c++中的特性,還是vc6自己的特性。
靜態(tài)數(shù)據(jù)成員的值在const成員函數(shù)中可以被合法的改變。舉例如下:
靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)沒有什么太多好講的。
1.靜態(tài)成員函數(shù)的地址可用普通函數(shù)指針儲存,而普通成員函數(shù)地址需要用類成員函數(shù)指針來儲存。舉例如下:
2.靜態(tài)成員函數(shù)不可以調(diào)用類的非靜態(tài)成員。因?yàn)殪o態(tài)成員函數(shù)不含this指針。
3.靜態(tài)成員函數(shù)不可以同時聲明為 virtual、const、volatile函數(shù)。舉例如下:
最后要說的一點(diǎn)是,靜態(tài)成員是可以獨(dú)立訪問的,也就是說,無須創(chuàng)建任何對象實(shí)例就可以訪問。
作者:SDMrFeng
原文:https://blog.csdn.net/tobefxz/article/details/14109697