C++面向?qū)ο?一)——類及對(duì)象基礎(chǔ)
C++面向?qū)ο?一)——類及對(duì)象基礎(chǔ)
C++是一種面向?qū)ο?OOP)的語言,強(qiáng)調(diào)抽象、封裝、多態(tài)、繼承、可重用性等,類(class)是組成OOP的重要特性。
類的類型定義
class關(guān)鍵字一個(gè)類。
class 類名{
訪問控制符:
//成員
};
成員可以為成員變量、成員函數(shù)等。一般地,將類的成員函數(shù)稱為類的方法。
類似于結(jié)構(gòu)體,在創(chuàng)建類的類型定義時(shí)不會(huì)為成員分配內(nèi)存;僅當(dāng)對(duì)象(類的變量)被定義時(shí)才會(huì)被分配內(nèi)存。
訪問控制標(biāo)簽
訪問控制標(biāo)簽限定了外部(位于該類之外)對(duì)類成員的可訪問性,限定范圍為從該標(biāo)簽至下個(gè)標(biāo)簽間的所有成員。
public:成員可被外部訪問。private:默認(rèn)標(biāo)簽,成員不可被外部訪問,僅可被內(nèi)部方法和友元函數(shù)訪問。若成員未被指定標(biāo)簽,則其默認(rèn)為private。protected:成員不可被外部訪問,僅可被內(nèi)部方法和派生類訪問。
C++擴(kuò)展了結(jié)構(gòu)體,使其大多數(shù)功能類似于類。唯一不同之處在于,class默認(rèn)標(biāo)簽為private,struct默認(rèn)標(biāo)簽為public
對(duì)象的定義
對(duì)象是類的變量,指類的實(shí)例,定義對(duì)象方法類與定義結(jié)構(gòu)體變量一致。
-
創(chuàng)建類的類型時(shí)定義對(duì)象:
int n; class temp{ //member }t[n]; -
先創(chuàng)建類的類型再定義對(duì)象:
int n; class temp{ //member }; temp t[n];
對(duì)象各自有有自己的數(shù)據(jù),但共享一組方法。
成員的訪問
類似于結(jié)構(gòu)體。
-
直接訪問運(yùn)算符
.:作用于對(duì)象上,通過對(duì)象名.成員進(jìn)行訪問。例:class temp{ public: int a; void fun(int a){ this->a=a; } }; temp t; t.x;//訪問變量 t.sum(1,2);//訪問方法 -
間接訪問運(yùn)算符
->:作用于對(duì)象指針上,通過對(duì)象指針名->成員進(jìn)行訪問。典例為通過this指針訪問本類中的對(duì)象。 -
域解析運(yùn)算符
:::用于訪問命名空間中的成員。在類中,其為訪問靜態(tài)變量成員,或先聲明后定義的方法中對(duì)方法的定義中,通過類名::方法以標(biāo)識(shí)該方法來自的類。
方法的實(shí)現(xiàn)
-
邊聲明邊定義:
class temp{ int a; public: void fun(int a){ this->a=a; } }; -
先聲明后定義:定義時(shí)需使用作用域解析運(yùn)算符(
::)以標(biāo)識(shí)函數(shù)所屬的類,即類名::函數(shù)名(形參表)class temp{ int a; public: void fun(int); }; void temp::fun(int a){ this->a=a; }
構(gòu)造函數(shù)
專門用于初始化類中成員變量的函數(shù),其與類名同名,沒有返回值,且必須被public標(biāo)簽修飾。
當(dāng)類無構(gòu)造函數(shù)時(shí),編譯器會(huì)自動(dòng)為對(duì)象創(chuàng)建空的構(gòu)造函數(shù)。
構(gòu)造函數(shù)可使用默認(rèn)參數(shù)。若定義了構(gòu)造函數(shù),則在定義對(duì)象時(shí)必須調(diào)用構(gòu)造函數(shù),為無默認(rèn)參數(shù)的其他形參提供實(shí)參。
-
邊聲明邊定義
class temp{ int a; public: temp(int a){ this->a=a; } }; -
先聲明后定義
class temp{ int a; public: temp(int); }; temp::temp(int a){ this->a=a; } -
定義對(duì)象:定義對(duì)象時(shí)必須調(diào)用構(gòu)造函數(shù),為無默認(rèn)參數(shù)的其他形參提供實(shí)參。
temp t(10);//隱式調(diào)用 temp t=temp(10);//顯式調(diào)用 -
構(gòu)造函數(shù)的初始化列表:
class temp{ int a,b; public: temp(int x,int y):a(x),b(y){ }//在形參表后 成員變量名(形參名),表示將形參賦值給成員變量 };
析構(gòu)函數(shù)
專門用于銷毀成員的函數(shù)(如經(jīng)過動(dòng)態(tài)分配內(nèi)存得到的成員變量),其名為~類名,沒有返回值,且必須被public標(biāo)簽修飾。
若成員變量均為塊作用域的局部變量,其將被自動(dòng)銷毀釋放,無需析構(gòu)函數(shù)。
當(dāng)類無析構(gòu)函數(shù)時(shí),編譯器會(huì)自動(dòng)為對(duì)象創(chuàng)建空的析構(gòu)函數(shù)。
析構(gòu)函數(shù)無需手動(dòng)顯式調(diào)用,編譯器會(huì)在恰當(dāng)時(shí)機(jī)自動(dòng)隱式調(diào)用。
-
邊聲明邊定義
class temp{ public: int *a=NULL; temp(){ a=new int; } ~temp(){ delete a; } }; -
先聲明后定義
class temp{ int *a=NULL; temp(); ~temp(); }; temp::temp(){ a=new int; } temp::~temp(){ delete a; }
注意:以上代碼僅供構(gòu)造函數(shù)與析構(gòu)函數(shù)的示例,實(shí)際上其存在淺拷貝問題。請(qǐng)不要這么使用!
this指針
this指針是由編譯器隱式定義的指向當(dāng)前對(duì)象本身的指針,在方法中可用this指針訪問成員,在解決變量命名沖突、繼承和多態(tài)中尤為重要。
使用方法:this->成員
class temp{
int a;
public:
temp(int a){
this->a=a;
}
};
對(duì)象數(shù)組
類名 對(duì)象名[對(duì)象個(gè)數(shù)];
若類具有構(gòu)造函數(shù),則必須使用初始化序列表,為每個(gè)對(duì)象調(diào)用構(gòu)造函數(shù)。
類名 對(duì)象名[對(duì)象個(gè)數(shù)]={類名(實(shí)參表),類名(實(shí)參表),...};//按順序?qū)?yīng)每個(gè)對(duì)象
類作用域
類中成員都具有類作用域,因此不同類才能使用同名變量及方法,這也導(dǎo)致訪問變量和方法時(shí)必須通過對(duì)象進(jìn)行訪問。
類模板
-
類模板類型的定義:
template<typename 泛型名1,typename 泛型名2,...> class 類名{ //成員 };此處
<>中的內(nèi)容稱為模板參數(shù)(形參),定義了若干泛型,其中typename為關(guān)鍵字(也可替換為class)。泛型在定義后即可像常規(guī)數(shù)據(jù)類型使用,但定義的所有泛型必須全部使用。 -
具有模板的類對(duì)象的創(chuàng)建:
類名<類型名1,類型名2,...>對(duì)象名; 類名<類型名1,類型名2,...>對(duì)象名(構(gòu)造函數(shù)實(shí)參);//有構(gòu)造函數(shù)此處
<>中的內(nèi)容稱為模板參數(shù)(實(shí)參),用于指定傳入的參數(shù)數(shù)據(jù)類型,編譯器將根據(jù)傳入的類型自動(dòng)生成對(duì)應(yīng)類型的類。

浙公網(wǎng)安備 33010602011771號(hào)