【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )
文章目錄
- 成員函數
- 常量函數
- 友元函數
- new 創建對象
- 友元類
- 單例類
成員函數
此處繼續上一篇博客繼續向后講解C++面向對象
類成員方法 , 除了定義構造方法與析構方法之外 , 還可以定義普通的成員方法 , 如設置 int age 變量的方法 , 這里聲明一個成員方法 , 傳入參數 int age , 給成員變量 int age 賦值 ;
使用共有函數訪問私有成員變量 , 在類中私有的成員變量時不允許從外部直接訪問的 , 需要通過共有函數來訪問 , 在共有函數中調用 this->成員變量 進行訪問 ; 這里的訪問是指獲取成員變量的值 , 或修改成員變量的值 ;
成員函數中申請內存 , 需要在析構函數中將內存釋放 , 不管在構造函數 , 還是在成員函數中申請的內存 , 都需要在析構函數中 , 將內存釋放掉 ;
Student.h 中相關聲明 :
//默認作用域 : 如果沒有指定作用域, 其作用域默認是 private 私有的//類中的屬性定義 int age;//聲明共有的成員方法 , 該方法需要實現 public : void setAge(int age);Student.cpp 實現上述聲明的方法 :
void Student::setAge(int age) {//使用 this 關鍵字訪問成員變量 , 并給成員變量賦值this->age = age; }常量函數
外部訪問類中的私有成員變量 , 有兩種方法 , 一種是使用共有的成員方法訪問 , 另一種是在友元函數中訪問 ;
常量函數 , 在頭文件中函數定義時 , 在方法后面加上 const 關鍵字 , 這個函數就變成了常量函數 , 該函數中不允許修改類中的成員變量 , 一般獲取成員變量值的函數可以定義成常量函數 ;
成員函數聲明時可以直接實現 , 可以在類中聲明成員函數的位置 , 直接實現該函數 , 這樣就不同在 Student.cpp 中實現了 ;
Student.h 中聲明并實現成員方法 :
//默認作用域 : 如果沒有指定作用域, 其作用域默認是 private 私有的//類中的屬性定義 int age;//聲明共有的成員方法 , 該方法需要實現 public : //在函數后加上 const , 該函數就變成了常量函數//常量函數中是不允許修改成員變量的//函數在聲明的時候也可以實現int getAge()const {return this->age;}友元函數
外部訪問類中的私有成員變量 , 有兩種方法 , 一種是使用共有的成員方法訪問 , 另一種是在友元函數中訪問 ;
友元函數 , 在友元函數中 , 可以從類的外部訪問類中的私有成員變量 , 友元函數聲明方法 friend 返回值類型 方法名稱 ( 參數列表 ) ; ;
Student.h 中友元函數聲明
//友元函數聲明 , 可以在外部修改類中的私有成員變量friend void changeAge(Student*);友元函數實現 , 友元函數并不與類實現寫在一起 , 而是在使用的位置進行實現 , 這里在 main() 函數所在的文件中進行實現 , 在該實現的友元函數中 , 可以訪問類對象的私有成員變量和方法 ;
003_Object_Oriented.cpp ( main函數定義文件 ) 中友元函數實現
//引用 Student 類聲明的頭文件 #include "Student.h"//友元函數實現 , 在類的外部修改類中的私有成員變量 age void changeAge(Student* student){student->age = 88; }new 創建對象
使用 new 創建對象 , 表示在堆中申請內存 , 將其定義成 Student 類型 , new 與 mallloc 作用類似 , 當對象不使用之后 , 需要使用 delete 對象名 , 對象會自動調用析構函數 , 將該對象銷毀 ; 下面的代碼中展示了 , 創建對象 , 使用對象 , 銷毀對象的過程 ;
- 創建對象 , new Student(18, 1); 使用 new 關鍵字 , 在堆內存中創建對象 , 注意這種對象使用完畢后需要手動調用 delete 對象名 進行釋放 ;
- 友元函數 , changeAge(student); 是調用友元函數修改對象的私有成員變量 ;
- 常量函數 , student->getAge() 調用共有的常量函數 , 獲取私有成員變量值 , 注意常量函數中不允許修改成員變量值 , 只允許獲取該值 ;
- 釋放內存 , delete student 作用是, 釋放使用 new 申請的堆內存中的內存 ;
代碼執行結果
Student() 構造方法 age : 88 ~Student() 析構方法友元類
友元類 , 友元類中所有的成員函數都是該類的友元函數 , 可以訪問該類對象的私有成員變量 ;
友元類聲明 , 聲明友元類方法 friend class 友元類名稱; , 友元類中所有的成員函數都是該類的友元函數 ;
Student.h 中友元類聲明
//聲明友元類 , 可以在友元類中訪問修改類中的私有成員變量//友元類中的所有的成員函數都是友元函數friend class Teacher;友元類定義與實現 , 友元類中定義的方法都是 Student 類的友元函數 , 其中需要傳入 Student* 參數來訪問 Student 對象的私有成員變量 ; 可以在定義的時候 , 直接將該方法實現 ;
//Student 中的友元類 , 該友元類中的所有函數都是 Student 對象的友元函數 class Teacher {public://友元類中聲明方法 , 修改 Student 中的 id 編號void setId(Student* student, int id) {student->id = id;}};單例類
單例類三要素
- ① 私有靜態單例類類型的靜態成員變量 ;
- ② 私有構造函數 ;
- ③ 靜態共有方法 , 該方法中調用私有構造方法創建唯一一個單例類對象 ;
單例類聲明 , 創建 Instance 單例類 ;
- ① 聲明一個私有的靜態成員變量 , 外部不能直接訪問該成員變量 ; private : static Instance* instance; ;
- ② 聲明私有構造函數 , 外部不能直接調用構造方法創建該類對象 ; private : Instance(); ;
- ③ 聲明靜態共有的方法 , 在該方法中調用私有構造函數創建單例對象 , public : static Instance* getInstance(); , 注意創建的這個單例對象是唯一的 , 只能創建一個 ;
Instance.h 單例類聲明
#pragma onceclass Instance {//聲明一個私有的靜態成員變量 , 及構造方法 //外部不能直接調用構造方法創建該類對象 private :static Instance* instance;Instance();//聲明共有靜態方法 //該方法中可調用私有構造方法并返回 Instance 對象 public :static Instance* getInstance();public : int number = 888;};單例類實現 , 在實現中 , 首先給 Instance::instance 靜態成員變量賦值初始值 0 , 靜態成員變量可以使用 類名::靜態成員變量名 訪問 ; 然后實現私有的構造函數 , 最后實現共有的單例類獲取函數 , 在該函數中首先判定單例類對象是否已經創建 , 如果已經創建 , 直接返回該單例類對象 , 如果沒有創建那么先創建該單例類對象 , 再返回該單例對象 instance ;
//設置Instance 靜態成員變量 初始值值 //靜態成員變量可以使用 類名::靜態成員變量名 訪問 Instance* Instance::instance = 0;//實現構造函數 Instance::Instance() { }//實現 getInstance 靜態成員函數 //方法的實現中 , 可以使用 this-> 調用成員變量或成員方法 //靜態的成員變量和成員函數可以直接調用 Instance* Instance::getInstance() {if (!instance) {instance = new Instance();}return instance; }單例類使用 , 首先在 CMakeList.txt 中配置上面的 Instance.h 和 Instance.cpp 兩個文件 , 然后在 main() 函數所在文件 , 包含 Instance.h 頭文件 , 即可在 main() 中使用該單例類了 ; 調用 Instance::getInstance(); 可創建單例類 , 注意單例類使用完畢后要釋放該類 , 否則會造成內存泄漏 ;
//創建單例對象Instance* instance = Instance::getInstance();//打印單例對象中的變量值cout << "單例 instance->number : " << instance->number << endl;//釋放單例類delete instance;代碼執行結果 :
單例 instance->number : 888總結
以上是生活随笔為你收集整理的【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【C++ 语言】面向对象 ( 类定义 |
- 下一篇: 【C++ 语言】面向对象 ( 函数重载