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