#### 21. 類 & 對象
C++ 在 C 語言的基礎上增加了面向對象編程,C++ 支持面向對象程序設計。類是 C++ 的核心特性,通常被稱為用戶定義的類型。
類用于指定對象的形式,它包含了數據表示法和用于處理數據的方法。類中的數據和方法稱為類的成員。函數在一個類中被稱為類的成員。
**類定義:**
定義一個類,本質上是定義一個數據類型的藍圖。這實際上并沒有定義任何數據,但它定義了類的名稱意味著什么,也就是說,它定義了類的對象包括了什么,以及可以在這個對象上執行哪些操作。
類定義是以關鍵字 **class** 開頭,后跟類的名稱。類的主體是包含在一對花括號中。類定義后必須跟著一個分號或一個聲明列表。例如,我們創建一個 \*.h 文件 使用關鍵字 **class** 定義 Person 數據類型,如下所示:
~~~
//定義了一個 Person ,跟 Java class 差不多
class Person {
public: //公共的屬性
Person(); //空參
~Person(); //Person 銷毀執行
Person(char *name, char *gen, int age); //有參構造
//成員變量
char *name;
char *gen;
int age;
//函數
void setName(char *name);
char *getName();
void setGen(char *gen);
char *getGen();
void setAge(int age);
int getAge();
};
復制代碼
~~~
關鍵字 **public** 確定了類成員的訪問屬性。在類對象作用域內,公共成員在類的外部是可訪問的。您也可以指定類的成員為 **private** 或 **protected**。
**定義 C++ 對象:**
類提供了對象的藍圖,所以基本上,對象是根據類來創建的。聲明類的對象,就像聲明基本類型的變量一樣。下面的語句聲明了類 Person的兩個對象:
~~~
Person personTemp;//聲明 personTemp 類型為 Person
復制代碼
~~~
**訪問數據成員:**
類的對象的公共數據成員可以使用直接成員訪問運算符 (.) 來訪問。為了更好地理解這些概念,讓我們嘗試一下下面的實例:
~~~
//1. person.h 文件中定義 Person 對象
//定義了一個 Person ,跟 Java class 差不多
class Person {
public: //公共的屬性
Person();
~Person();
Person(char *name, char *gen, int age);
char *name;
char *gen;
int age;
void setName(char *name);
char *getName();
void setGen(char *gen);
char *getGen();
void setAge(int age);
int getAge();
};
//2. person.cpp
Person::Person(char *name, char *gen, int age) {
this->name = name;
this->age = age;
this->gen = gen;
}
Person::~Person() {
cout << "Person 銷毀" << endl;
}
Person::Person() {
cout << "執行 Person 空參構造函數" << endl;
}
void Person::setAge(int age) {
this->age = age;
}
void Person::setName(char *name) {
this->name = name;
}
void Person::setGen(char *gen) {
this->gen = gen;
}
char *Person::getName() {
cout << "DevYK getName" << endl;
return this->name;
}
char *Person::getGen() {
return this->gen;
}
int Person::getAge() {
return this->age;
}
//3. 測試
void test19() {
//棧里面定義的當該方法執行完就會回收掉 Person 對象
Person personTemp;
personTemp.setGen("男");
personTemp.setName("小明");
personTemp.setAge(18);
cout << personTemp.getName() << "\t" << personTemp.getGen() << "\t" << personTemp.getAge() << endl;
//初始化 Person 對象,在堆內存中,如果不主動清理 那么就會造成 內存泄漏
Person *person = new Person("DevYK", "男", 28);
cout << person->getName() << "\t" << person->getGen() << "\t" << person->getAge() << endl;
//釋放 person 堆內存
delete person;
}
復制代碼
~~~
> **輸出:**
>
> 執行 Person 空參構造函數 小明 男 18 DevYK 男 28 Person 銷毀 Person 銷毀
需要注意的是,私有的成員和受保護的成員不能使用直接成員訪問運算符 (.) 來直接訪問。我們將在后續的教程中學習如何訪問私有成員和受保護的成員。
**類 & 對象詳解:**
到目前為止,我們已經對 C++ 的類和對象有了基本的了解。下面的列表中還列出了其他一些 C++ 類和對象相關的概念,可以點擊相應的鏈接進行學習。
| 概念 | 描述 |
| --- | --- |
| [類成員函數](https://www.runoob.com/cplusplus/cpp-class-member-functions.html) | 類的成員函數是指那些把定義和原型寫在類定義內部的函數,就像類定義中的其他變量一樣。 |
| [類訪問修飾符](https://www.runoob.com/cplusplus/cpp-class-access-modifiers.html) | 類成員可以被定義為 public、private 或 protected。默認情況下是定義為 private。 |
| [構造函數 & 析構函數](https://www.runoob.com/cplusplus/cpp-constructor-destructor.html) | 類的構造函數是一種特殊的函數,在創建一個新的對象時調用。類的析構函數也是一種特殊的函數,在刪除所創建的對象時調用。 |
| [C++ 拷貝構造函數](https://www.runoob.com/cplusplus/cpp-copy-constructor.html) | 拷貝構造函數,是一種特殊的構造函數,它在創建對象時,是使用同一類中之前創建的對象來初始化新創建的對象。 |
| [C++ 友元函數](https://www.runoob.com/cplusplus/cpp-friend-functions.html) | **友元函數**可以訪問類的 private 和 protected 成員。 |
| [C++ 內聯函數](https://www.runoob.com/cplusplus/cpp-inline-functions.html) | 通過內聯函數,編譯器試圖在調用函數的地方擴展函數體中的代碼。 |
| [C++ 中的 this 指針](https://www.runoob.com/cplusplus/cpp-this-pointer.html) | 每個對象都有一個特殊的指針 **this**,它指向對象本身。 |
| [C++ 中指向類的指針](https://www.runoob.com/cplusplus/cpp-pointer-to-class.html) | 指向類的指針方式如同指向結構的指針。實際上,類可以看成是一個帶有函數的結構。 |
| [C++ 類的靜態成員](https://www.runoob.com/cplusplus/cpp-static-members.html) | 類的數據成員和函數成員都可以被聲明為靜態的。 |
- 前言
- JNI基礎知識
- C語言知識點總結
- ①基本語法
- ②數據類型
- 枚舉類型
- 自定義類型(類型定義)
- ③格式化輸入輸出
- printf函數
- scanf函數
- 編程規范
- ④變量和常量
- 局部變量和外部變量
- ⑤類型轉換
- ⑥運算符
- ⑦結構語句
- 1、分支結構(選擇語句)
- 2、循環結構
- 退出循環
- break語句
- continue語句
- goto語句
- ⑧函數
- 函數的定義和調用
- 參數
- 函數的返回值
- 遞歸函數
- 零起點學通C語言摘要
- 內部函數和外部函數
- 變量存儲類別
- ⑨數組
- 指針
- 結構體
- 聯合體(共用體)
- 預處理器
- 預處理器的工作原理
- 預處理指令
- 宏定義
- 簡單的宏
- 帶參數的宏
- 預定義宏
- 文件包含
- 條件編譯
- 內存中的數據
- C語言讀文件和寫文件
- JNI知識點總結
- 前情回顧
- JNI規范
- jni開發
- jni開發中常見的錯誤
- JNI實戰演練
- C++(CPP)在Android開發中的應用
- 掘金網友總結的音視頻開發知識
- 音視頻學習一、C 語言入門
- 1.程序結構
- 2. 基本語法
- 3. 數據類型
- 4. 變量
- 5. 常量
- 6. 存儲類型關鍵字
- 7. 運算符
- 8. 判斷
- 9. 循環
- 10. 函數
- 11. 作用域規則
- 12. 數組
- 13. 枚舉
- 14. 指針
- 15. 函數指針與回調函數
- 16. 字符串
- 17. 結構體
- 18. 共用體
- 19. typedef
- 20. 輸入 & 輸出
- 21.文件讀寫
- 22. 預處理器
- 23.頭文件
- 24. 強制類型轉換
- 25. 錯誤處理
- 26. 遞歸
- 27. 可變參數
- 28. 內存管理
- 29. 命令行參數
- 總結
- 音視頻學習二 、C++ 語言入門
- 1. 基本語法
- 2. C++ 關鍵字
- 3. 數據類型
- 4. 變量類型
- 5. 變量作用域
- 6. 常量
- 7. 修飾符類型
- 8. 存儲類
- 9. 運算符
- 10. 循環
- 11. 判斷
- 12. 函數
- 13. 數學運算
- 14. 數組
- 15. 字符串
- 16. 指針
- 17. 引用
- 18. 日期 & 時間
- 19. 輸入輸出
- 20. 數據結構
- 21. 類 & 對象
- 22. 繼承
- 23. 重載運算符和重載函數
- 24. 多態
- 25. 數據封裝
- 26. 接口(抽象類)
- 27. 文件和流
- 28. 異常處理
- 29. 動態內存
- 30. 命名空間
- 31. 預處理器
- 32. 多線程
- 總結
- 音視頻學習 (三) JNI 從入門到掌握
- 音視頻學習 (四) 交叉編譯動態庫、靜態庫的入門學習
- 音視頻學習 (五) Shell 腳本入門
- 音視頻學習 (六) 一鍵編譯 32/64 位 FFmpeg 4.2.2
- 音視頻學習 (七) 掌握音頻基礎知識并使用 AudioTrack、OpenSL ES 渲染 PCM 數據
- 音視頻學習 (八) 掌握視頻基礎知識并使用 OpenGL ES 2.0 渲染 YUV 數據
- 音視頻學習 (九) 從 0 ~ 1 開發一款 Android 端播放器(支持多協議網絡拉流/本地文件)
- 音視頻學習 (十) 基于 Nginx 搭建(rtmp、http)直播服務器
- 音視頻學習 (十一) Android 端實現 rtmp 推流
- 音視頻學習 (十二) 基于 FFmpeg + OpenSLES 實現音頻萬能播放器
- 音視頻學習 (十三) Android 中通過 FFmpeg 命令對音視頻編輯處理(已開源)