C++中的類有兩個(gè)成分:
(1)成員變量
成員變量按照作用域分為靜態(tài)成員變量和非靜態(tài)成員變量,C++中成員變量的默認(rèn)控制符是private,這點(diǎn)與Java不太一樣。;按照控制符又可以分為public, private, protected;
靜態(tài)成員變量本質(zhì)上只是說(shuō)明了該變量的持續(xù)性和作用域,而不是定義
靜態(tài)成員變量不能重復(fù)定義,故靜態(tài)成員變量不能在類中或者構(gòu)造函數(shù)中初始化,因?yàn)閷?duì)象創(chuàng)建的時(shí)候會(huì)執(zhí)行一次;靜態(tài)成員變量一般在類的外部進(jìn)行初始化,并且要放在所有代碼塊之外(全局作用域)。如果靜態(tài)成員變量是const類型則可以在類定義中初始化。
靜態(tài)成員變量的初始化格式 type class::variable=value;
非靜態(tài)成員變量在對(duì)象創(chuàng)建時(shí)(分配內(nèi)存)才被定義,并由構(gòu)造函數(shù)初始化
(2)成員函數(shù)
C++中的成員函數(shù)定義的位置有兩種:
(1)定義在類中
優(yōu)點(diǎn):簡(jiǎn)單方便明了
缺點(diǎn):類定義包含類實(shí)現(xiàn),可定制性差
(2)定義在類外
優(yōu)點(diǎn):可定制性好
缺點(diǎn):每次定義的時(shí)候要加上類名class:: class_function(){}
同樣的,按照作用域來(lái)分,有靜態(tài)成員函數(shù)和非晶態(tài)成員函數(shù),按照控制符來(lái)分,有public, private, protected
靜態(tài)成員函數(shù)在類沒(méi)有定義前就可以使用,故靜態(tài)成員函數(shù)無(wú)法訪問(wèn)非靜態(tài)成員變量,它只能訪問(wèn)靜態(tài)成員函數(shù)內(nèi)部定義的變量或者靜態(tài)成員變量
Java中的類是可以訪問(wèn)私有成員變量的;
靜態(tài)成員函數(shù)要想訪問(wèn)私有成員變量,有兩種方案:
方案一:將所有訪問(wèn)的數(shù)據(jù)都定義成靜態(tài)成員變量;
方案二:
class a
?{?
public:? static FunctionA(a* _a)?
? ? {? ? a-> menber = 1;? }??
? ? private:? int menber;?
}
靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的根本區(qū)別是:非靜態(tài)成員函數(shù)有 this 指針,而靜態(tài)成員函數(shù)沒(méi)有 this 指針。由此決定了靜態(tài)成員函數(shù)不能訪問(wèn)本類中的非靜態(tài)成員
注:友元
成員函數(shù)是屬于類的,而類中的私有成員變量只有成員函數(shù)才能訪問(wèn),非成員函數(shù)想訪問(wèn)私有成員函數(shù),可以在函數(shù)定義前加上friend。成員函數(shù)的調(diào)用形式是
class A{};
A a;
a.function();
非成員函數(shù)可以直接調(diào)用;
在對(duì)某些成員函數(shù)多次調(diào)用時(shí),由于參數(shù)傳遞,類型檢查和安全性檢查等都需要時(shí)間開銷,而影響程序的運(yùn)行效率。為了解決上述問(wèn)題,提出一種使用友元的方案。友元是一種定義在類外部的普通函數(shù),但它需要在類體內(nèi)進(jìn)行說(shuō)明,為了與該類的成員函數(shù)加以區(qū)別,在說(shuō)明時(shí)前面加以關(guān)鍵字friend。友元不是成員函數(shù),但是它可以訪問(wèn)類中的私有成員。友元的作用在于提高程序的運(yùn)行效率,但是,它破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問(wèn)類的私有成員。
注:Java與C++中關(guān)于static的區(qū)別與聯(lián)系
java中的“static”和C++中的“static”含義并不完全一樣?。?!C++中的關(guān)鍵字static被復(fù)寫了三次,有三種含義,分別為:
1:變量一直存在
2:不能被其他文件訪問(wèn)的全局變量和函數(shù)
3:屬于類且不屬于對(duì)象的全局變量和函數(shù)
在一大部分人心中可能只把它理解為“靜態(tài)”的意思,實(shí)際上Java僅僅取了C++中static的最后一個(gè)含義:即,不與類的實(shí)例相關(guān)聯(lián),僅與類相關(guān)聯(lián)。