日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第二章-类和对象

發布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第二章-类和对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第二章-類和對象

文章目錄

  • 第二章-類和對象
    • 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.構造函數

構造函數的作用是在對象被創建時利用特定的值構造對象,將對象初始化為一個特定的狀態

  • 構造函數的函數名與類名相同,而且沒有返回值
  • 構造函數也是類的一個成員函數,聲明為公有函數,但不能在外部顯式調用
  • 構造函數允許重載,系統會根據初始化定義自動選取構造函數!
  • 如果類中沒有寫構造函數,編譯器會自動生成一個隱含的默認構造函數,其參數列表和函數體為空
class A{ public:A(){} //無參構造函數A(int i){ //有參構造函數x=i;}A(int i,int j){ //重載x=i;y=j;} private:int x,y; }; int main(){A a; //調用無參構造函數A b(2); //調用有參構造函數A c(3,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.析構函數

析構函數是在對象的生存周期即將結束的時候自動調用的,用來完成對象被刪除的一些清理工作

  • 析構函數也是類的一個公有函數成員,名稱是由由類名前面加 ~ 構成,沒有返回值
  • 析構函數可以在外部顯式調用,但不能進行重載
  • 析構函數不接受任何參數(但可以是虛函數)
  • 如果不顯式說明,系統會生成一個函數體為空的隱含的析構函數
class A{~A(){} //析構函數 }; class A{~A(){cout<<"A destroy()"<<endl;} }; int main(){A a;a.~A(); //顯式調用return 0; }

7.類的組合

類的組合就是一個類內嵌其他類的對象作為成員的情況,它們的關系是包含與被包含的關系

  • 創建類的對象時,如果這個類具有內嵌對象成員,那么各個內嵌對象將首先被自動創建
  • 創建對象時既要對本類的數據成員進行初始化,又要對內嵌對象成員進行初始化
  • 構造函數的調用順序為
    • (1)調用內嵌函數的構造函數,調用順序按照內嵌對象在組合類的定義中出現的次序。
    • (2)執行本類構造函數的函數體
  • 析構函數的調用順序與構造函數剛好相反
  • 如果沒顯示聲明,必要時編譯系統會自動生成組合類的復制構造函數
class A{ public:int x,y; }; class B{ public:B(A ab1,A ab2); //組合類構造函數 private:A a1,a2; //A類對象a1,a2double sum; }; B::B(A ab1,A ab2):a1(ab1),a2(ab2){sum=a1.x+a2.y; }

Tips

  • 前向引用說明
    • 前向引用聲明,在引用未定義的類前,將該類的名字告訴編譯器,讓編譯器知道這是一個類名
    • 使用前向引用聲明時,只能使用類的名稱,不能涉及任何細節
    • 盡管使用了前向引用聲明,但是在提供一個類的完整聲明前,不能聲明該類的對象,也不能在內聯成員函數中使用該類的對象
class B; //前向引用說明 class A{ public:B &b; //可以聲明 B類的對象引用或指針B* c; B d; //錯誤,類 B的聲明尚不完善 }; class B{ public:A a; //A已經在B之前聲明了 };
  • 聯合體
    • 聯合體是一種特殊的類,默認訪問控制屬性是公有類型的
    • 聯合體的成員共用相同的內存單元,聯合體變量中的成員至多有一個是有意義的
    • 聯合體不能被繼承,不支持包含多態
union Mark{char grade;bool pass;int percent; };

總結

以上是生活随笔為你收集整理的第二章-类和对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。