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