C++類與對象的詳細(xì)說明
類的引入
在引入類之前,先來回憶一下C語言中的結(jié)構(gòu)體。結(jié)構(gòu)體是一種自定義類型,可以在其中定義變量,如我們所熟悉的日期結(jié)構(gòu)體:
struct Date { int year; int month; int day; };
而在C++中,結(jié)構(gòu)體被升級成了類,結(jié)構(gòu)體中不僅可以定義成員變量,也可以定義成員函數(shù)(成員方法):
struct Date { //成員變量 int year; int month; int day; //成員方法 void print() { cout << year << "-" << month << "-" << "day" << endl; } };
在C++中,更喜歡使用class來替代struct,當(dāng)然它們也有所差別,在之后會說明。
類的定義
類的定義可以分為兩種,即聲明和定義全部放在類體中與聲明與定義分離。
1、聲明和定義全部放在類體中
該方式即為上一舉例代碼的定義方式。但要注意,如果采用這種方法定義成員函數(shù),編譯器可能會將該函數(shù)作為內(nèi)聯(lián)函數(shù)處理。
2、聲明放在頭文件,定義放在源文件中
頭文件中成員函數(shù)只需要聲明:
struct Date { //成員變量 int year; int month; int day; //成員方法 void print(); };
在源文件中對函數(shù)進行定義:
void Date::print() { cout << year << "-" << month << "-" << "day" << endl; }
需要注意,print為類域中的函數(shù),如果不加Date::用以指定類域,會導(dǎo)致定義出錯。因此,使用該方式定義成員函數(shù)時,一定要注意指定類域。
類的訪問限定符號及封裝
訪問限定符
訪問限定符分為三種:
(1)public修飾的成員在類外可以直接被訪問:
class Date { public: int year; int month; int day; void print() { cout << year << "-" << month << "-" << "day" << endl; } }; int main() { Date date; date.day = 0; }
如上代碼,在main函數(shù)中可以直接對對象中的成員變量day進行訪問。
(2)protected和private修飾的成員變量在類外不能被直接訪問
class Date { private: int year; int month; int day; void print() { cout << year << "-" << month << "-" << "day" << endl; } }; int main() { Date date; date.day = 0; }
此時如果在main函數(shù)中對直接對象中的成員變量day進行訪問,會導(dǎo)致錯誤
(3)訪問權(quán)限作用域是從該訪問限定符的位置開始直到下一個訪問限定符出現(xiàn)時為止
class Date { private: int year; int month; int day; public: void print() { cout << year << "-" << month << "-" << "day" << endl; } };
如上代碼,成員變量均為私有的,而成員函數(shù)print為公有的。
(4)class的默認(rèn)訪問權(quán)限(即不寫訪問限定符時)為private,struct為public
封裝
封裝實際上是一種更好的嚴(yán)格管理
將數(shù)據(jù)和方法封裝到類里,可以訪問的定義為共有,不想給他人訪問的定義為私有或保護。如此一來就做到了隱藏對象的屬性和細(xì)節(jié),僅僅對外公開接口來和對象進行交互,更加安全高效。
類的實例化
所謂類的實例化,簡而言之就是用類類型創(chuàng)建對象的過程。
打個比方,類就好似建筑的圖紙,而對象就是根據(jù)圖紙造出的建筑。對象是真實存在摸得著的,只有實例化出的對象才能夠?qū)嶋H存儲數(shù)據(jù)。
類對象模型
學(xué)過C語言我們知道如何計算結(jié)構(gòu)體的大小,那么在C++中,類的大小如何確定呢?
我們所不清楚的,就是類中成員函數(shù)的大小如何計算。實事上對于同一類的不同對象,處理問題的方法是相同的,如果每個對象都要保存一遍成員方法,未免有些過于浪費空間了。
因此在C++中,成員函數(shù)存放在公共代碼段。計算類的大小只需要按照C語言中結(jié)構(gòu)體大小的計算規(guī)則即可,不需要考慮成員函數(shù)。
注意:空類的大小為1byte,不存儲有效數(shù)據(jù),但需要占位用以表示對象存在。
this指針
class Date { private: int _year; int _month; int _day; public: void init(int year, int month, int day) { _year = year; _month = month; _day = day; } }; int main() { Date date1, date2; date1.init(2022, 2, 14); date2.init(2022, 2, 15); }
對于上述代碼,有一個問題,date1與date2這兩個對象分別都調(diào)用了init進行初始化,那么init函數(shù)是如何區(qū)分該為哪個對象進行初始化的呢?
C++通過引入this指針解決了這個問題。
this指針的特性
1、this指針的類型:類類型* const,存放對象的地址
2、只能在成員函數(shù)內(nèi)部使用
3、this指針本質(zhì)上是成員函數(shù)的形參,傳參時存放在棧幀中,對象中不存儲this指針
4、this指針為隱藏的形參,不需要用戶傳遞
在上述代碼實際被處理成了這樣:
void init(int year, int month, int day) { this->_year = year; this->_month = month; this->_day = day; }
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++數(shù)據(jù)結(jié)構(gòu)之并查集詳解
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之并查集詳解,并查集是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相交集合的合并及查詢問題,并查集的思想是用一個數(shù)組表示了整片森林,需要的朋友可以參考下2023-08-08C語言實現(xiàn)進程5狀態(tài)模型的狀態(tài)機
狀態(tài)機在實際工作開發(fā)中應(yīng)用非常廣泛,用這幅圖就可以很清晰的表達整個狀態(tài)的流轉(zhuǎn)。本篇通過C語言實現(xiàn)一個簡單的進程5狀態(tài)模型的狀態(tài)機,讓大家熟悉一下狀態(tài)機的魅力,需要的可以參考一下2022-10-10C/C++百行代碼實現(xiàn)熱門游戲消消樂功能的示例代碼
這篇文章主要介紹了C/C++百行代碼實現(xiàn)熱門游戲消消樂功能的示例代碼,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07Qt如何實現(xiàn)輸入框@聯(lián)系人的@檢測的示例
本文主要介紹了Qt如何實現(xiàn)輸入框@聯(lián)系人的@檢測的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08