第二章-类和对象
第二章-類和對象
文章目錄
- 第二章-類和對象
- 1.語法形式
- 2.訪問控制
- 3.對象
- 4.構(gòu)造函數(shù)
- 5.復(fù)制構(gòu)造函數(shù)
- 6.析構(gòu)函數(shù)
- 7.類的組合
- Tips
1.語法形式
定義一個(gè) class 的語法形式如下:
class 類名稱 { public:外部成員&方法 protected:保護(hù)型成員&方法 private:私有成員&方法 };示例:
class A { public:int a,b;void print1(){ //方法在類內(nèi)部實(shí)現(xiàn)printf("h1");} protected:int c,d;void print2(){printf("h2");} private:int e,f;void print3(){printf("h3");} };如果 class 的方法要在外部實(shí)現(xiàn)時(shí),使用類名和域運(yùn)算符( :: )聲明
class stu{ public:void print(); }; void stu::print() {cout<<"This is stu"<<endl; }2.訪問控制
public、protected、private 三個(gè)關(guān)鍵字提供了不同的訪問控制機(jī)制
- 公有類型public
公有類型成員定義了類的外部接口,在類外只能訪問類的公有成員
- 私有類型private
私有類型成員只能被本類的成員函數(shù)訪問,來自類外部的訪問都是非法的
- 保護(hù)類型protected
保護(hù)類型成員性質(zhì)與私有成員性質(zhì)相似,差別在于保護(hù)繼承時(shí)子類成員函數(shù)可以訪問父類保護(hù)成員
設(shè)計(jì)一個(gè)類,是為了用它,要能夠使用,就一定要設(shè)計(jì)必要的外部接口。
3.對象
在C++中,類的對象就是該類的某一特定實(shí)體,聲明一個(gè)對象和聲明一個(gè)一般變量相同。
訪問對象的成員,采用“.”操作符,一般形式為:
對象名.數(shù)據(jù)成員名
對象名.函數(shù)成員名(參數(shù)表)
示例如下:
class B { public:int b;void print(){printf("b=%d\n",b);} }; int main() {B btp;btp.b=10;btp.print(); //輸出b=10return 0; }C++還可以使用 new 關(guān)鍵字來創(chuàng)建對象。不同的是,使用 new 時(shí)需要用對象指針說明引用,對象指針要用“->”操作符來訪問對象成員。
class B { public:int b;void print(){printf("b=%d\n",b);} }; int main() {B* btp = new B();btp->b=10;btp->print(); //輸出b=10return 0; }4.構(gòu)造函數(shù)
構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時(shí)利用特定的值構(gòu)造對象,將對象初始化為一個(gè)特定的狀態(tài)
- 構(gòu)造函數(shù)的函數(shù)名與類名相同,而且沒有返回值
- 構(gòu)造函數(shù)也是類的一個(gè)成員函數(shù),聲明為公有函數(shù),但不能在外部顯式調(diào)用
- 構(gòu)造函數(shù)允許重載,系統(tǒng)會根據(jù)初始化定義自動(dòng)選取構(gòu)造函數(shù)!
- 如果類中沒有寫構(gòu)造函數(shù),編譯器會自動(dòng)生成一個(gè)隱含的默認(rèn)構(gòu)造函數(shù),其參數(shù)列表和函數(shù)體為空
5.復(fù)制構(gòu)造函數(shù)
復(fù)制構(gòu)造函數(shù)的作用是使用一個(gè)已經(jīng)存在的對象,去初始化一個(gè)同類的一個(gè)新對象
- 復(fù)制構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),形參是本類對象的引用
- 如果不顯式說明,系統(tǒng)會生成一個(gè)隱含的復(fù)制構(gòu)造函數(shù),對初始化對象進(jìn)行拷貝
一般方法為:
class 類名{ public:類名(類名 & 對象名) } class A{ public:A(int i){ //構(gòu)造函數(shù)x=i;}A(A &p); //復(fù)制構(gòu)造函數(shù) private:int x; }; A::A(A &p){ //復(fù)制構(gòu)造函數(shù)的實(shí)現(xiàn)x=p.x;cout<<"復(fù)制構(gòu)造函數(shù)被調(diào)用"<<endl; } int main(){A a(2);A b(a); //用對象a初始化對象b,復(fù)制構(gòu)造函數(shù)被調(diào)用 }6.析構(gòu)函數(shù)
析構(gòu)函數(shù)是在對象的生存周期即將結(jié)束的時(shí)候自動(dòng)調(diào)用的,用來完成對象被刪除的一些清理工作
- 析構(gòu)函數(shù)也是類的一個(gè)公有函數(shù)成員,名稱是由由類名前面加 ~ 構(gòu)成,沒有返回值
- 析構(gòu)函數(shù)可以在外部顯式調(diào)用,但不能進(jìn)行重載
- 析構(gòu)函數(shù)不接受任何參數(shù)(但可以是虛函數(shù))
- 如果不顯式說明,系統(tǒng)會生成一個(gè)函數(shù)體為空的隱含的析構(gòu)函數(shù)
7.類的組合
類的組合就是一個(gè)類內(nèi)嵌其他類的對象作為成員的情況,它們的關(guān)系是包含與被包含的關(guān)系
- 創(chuàng)建類的對象時(shí),如果這個(gè)類具有內(nèi)嵌對象成員,那么各個(gè)內(nèi)嵌對象將首先被自動(dòng)創(chuàng)建
- 創(chuàng)建對象時(shí)既要對本類的數(shù)據(jù)成員進(jìn)行初始化,又要對內(nèi)嵌對象成員進(jìn)行初始化
- 構(gòu)造函數(shù)的調(diào)用順序?yàn)?
- (1)調(diào)用內(nèi)嵌函數(shù)的構(gòu)造函數(shù),調(diào)用順序按照內(nèi)嵌對象在組合類的定義中出現(xiàn)的次序。
- (2)執(zhí)行本類構(gòu)造函數(shù)的函數(shù)體
- 析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)剛好相反
- 如果沒顯示聲明,必要時(shí)編譯系統(tǒng)會自動(dòng)生成組合類的復(fù)制構(gòu)造函數(shù)
Tips
- 前向引用說明
- 前向引用聲明,在引用未定義的類前,將該類的名字告訴編譯器,讓編譯器知道這是一個(gè)類名
- 使用前向引用聲明時(shí),只能使用類的名稱,不能涉及任何細(xì)節(jié)
- 盡管使用了前向引用聲明,但是在提供一個(gè)類的完整聲明前,不能聲明該類的對象,也不能在內(nèi)聯(lián)成員函數(shù)中使用該類的對象
- 聯(lián)合體
- 聯(lián)合體是一種特殊的類,默認(rèn)訪問控制屬性是公有類型的
- 聯(lián)合體的成員共用相同的內(nèi)存單元,聯(lián)合體變量中的成員至多有一個(gè)是有意義的
- 聯(lián)合體不能被繼承,不支持包含多態(tài)
總結(jié)