类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针
文章目錄
- 類的概念
- struct
- class
- class和struct的區(qū)別是什么呢?
- 類中成員函數(shù)的兩種定義方式
- 聲明和定義都在類中
- 聲明和定義分離
- 類的訪問(wèn)控制和封裝
- 類的封裝特性
- 類的大小
- 結(jié)構(gòu)體內(nèi)存對(duì)齊規(guī)則
- 類的存儲(chǔ)方式
- this指針
類的概念
在C++中,類可以說(shuō)是最重要的東西,因?yàn)镃++一開始的定位就是c with class,也正是因?yàn)橐肓祟?#xff0c;才讓c++從c的面向過(guò)程思想轉(zhuǎn)變?yōu)槊嫦驅(qū)ο蟮乃枷?#xff0c;關(guān)注的是對(duì)象,將一件事情拆分成不同的對(duì)象,靠對(duì)象之間的交互完成。
C++有兩種能夠創(chuàng)建類的方法
struct
第一種是struct,也就是從C繼承而來(lái)的,在C語(yǔ)言中,struct可以用來(lái)創(chuàng)建結(jié)構(gòu)體,但是結(jié)構(gòu)體中只能保存變量,而不能保存函數(shù),在C++中,struct不僅可以用來(lái)創(chuàng)建類,還保留了C語(yǔ)言中結(jié)構(gòu)體的用法
struct Date {void PrintDate(){cout << _year << '-' << _month << '-' << _day << endl;}int _year;int _month;int _day; };class
class是C++中定義類的關(guān)鍵字,他的用法和struct類似。
在類中,類的元素被稱為類的成員,類中的數(shù)據(jù)被稱為成員變量或者類的屬性,類中的函數(shù)被稱為類的方法或者成員函數(shù)
class Date {void PrintDate(){cout << _year << '-' << _month << '-' << _day << endl;}int _year;int _month;int _day; };class和struct的區(qū)別是什么呢?
類中成員函數(shù)的兩種定義方式
聲明和定義都在類中
如果成員函數(shù)在類內(nèi)部定義,則其是隱式的inline函數(shù)。
class Date {void PrintDate(){cout << _year << '-' << _month << '-' << _day << endl;}int _year;int _month;int _day; };聲明和定義分離
在類內(nèi)聲明,在類外定義,這樣能讓類更加簡(jiǎn)潔,不那么臃腫,通常都是使用這種方式。
class Date {void PrintDate();int _year;int _month;int _day; };//需要通過(guò)作用域運(yùn)算符指定這個(gè)方法屬于Date類 void Date::PrintDate() {cout << _year << '-' << _month << '-' << _day << endl; }類的訪問(wèn)控制和封裝
訪問(wèn)限定符有三種,分別是public,private,protected
類的封裝特性
封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開接口來(lái)和對(duì)象進(jìn)行 交互。
封裝本質(zhì)上是一種管理:我們?nèi)绾喂芾肀R俑呢?如果什么都不管,兵馬俑可能會(huì)被隨意破壞。那么我們首先建了一座房子把兵馬俑給封裝起來(lái)。但是我們目的并不是全封裝起來(lái),不讓別人看。所以我們開放了售票通道,可以通過(guò)買票突破封裝、在合理的監(jiān)管機(jī)制下進(jìn)去參觀。類也是一樣,我們將類數(shù)據(jù)和方法都封裝一下。不想給別人肆意修改,我們使用protected/private把成員封裝起來(lái)。同時(shí)開放一些共有的成員函數(shù)對(duì)成員合理的訪問(wèn)機(jī)制。所以封裝本質(zhì)是一種管理。
一般對(duì)于對(duì)象的屬性,我們不希望別人對(duì)它進(jìn)行修改,所以會(huì)用private將其封裝,但是我們又需要給別人提供獲取它的接口,所以會(huì)對(duì)方法和接口給與public屬性。
類的大小
class Date { public:void PrintDate();private:char a;int _year;int _month;int _day; };我們可以看到,類中有成員函數(shù),有成員變量,那么類的大小是如何計(jì)算的呢?
int main() {Date d;cout << sizeof(d) << endl; }
這里用sizeof查看大小,發(fā)現(xiàn)只有成員變量的大小(三個(gè)int類型一個(gè)char類型,3*4+1=13,這里的16是因?yàn)閮?nèi)存對(duì)齊偏移了3個(gè)字節(jié)),而沒(méi)有成員函數(shù)的大小
結(jié)構(gòu)體內(nèi)存對(duì)齊規(guī)則
注意:對(duì)齊數(shù) = 編譯器默認(rèn)的一個(gè)對(duì)齊數(shù) 與 該成員大小 兩者中的較小值。(如int大小為4,VS中默認(rèn)的對(duì)齊數(shù)為8,取4)
類的存儲(chǔ)方式
為什么會(huì)只保存了成員變量呢?這里就要引申出類的存儲(chǔ)方式。
對(duì)于上面的類,如果我們將類實(shí)例化為多個(gè)對(duì)象,實(shí)際上這些對(duì)象不同的地方只有它的屬性,它們調(diào)用的方法都是完全相同的, 為了不重復(fù)保存這些代碼,C++只保存了屬性,而將方法放到了公共的代碼段中,來(lái)避免了空間的浪費(fèi)。
同時(shí),如果一個(gè)類中什么都沒(méi)有,編譯器會(huì)給這個(gè)類一個(gè)字節(jié),來(lái)唯一標(biāo)識(shí)這個(gè)類。
總結(jié):類的大小就是成員變量之和(需要考慮內(nèi)存對(duì)齊)
this指針
void Date::PrintDate() {cout << _year << '-' << _month << '-' << _day << endl; }對(duì)于類中的成員函數(shù),我們并沒(méi)有將對(duì)象的屬性傳給他,那么他是如何能夠獲取這些屬性的呢?
C++編譯器給每個(gè)“非靜態(tài)的成員函數(shù)“增加了一個(gè)隱藏的指針參數(shù)(this指針),讓該指針指向當(dāng)前對(duì)象(函數(shù)運(yùn)行時(shí)調(diào)用該函數(shù)的對(duì)象),在函數(shù)體中所有對(duì)成員變量的操作,都是通過(guò)該指針去訪問(wèn)。只不過(guò)所有的操作對(duì)用戶是透明的,即用戶不需要來(lái)傳遞,編譯器自動(dòng)完成。
其實(shí)類的成員函數(shù)中隱含了一個(gè)this指針,所以在編譯器處理的時(shí)候,上面的代碼等價(jià)于
void Date::PrintDate(Date * const this) {cout << this->_year << '-' << this->_month << '-' << this->_day << endl; }- 這個(gè)this指針的類型是類類型 * const this,之所以是頂層const的原因是因?yàn)閠his指針唯一指向?qū)ο蟮刂贰?/li>
- this指針只能在成員函數(shù)中使用
- this指針本質(zhì)上其實(shí)是一個(gè)成員函數(shù)的形參,是對(duì)象調(diào)用成員函數(shù)時(shí),將對(duì)象地址作為實(shí)參傳遞給this形參。所以對(duì)象中不存儲(chǔ)this指針,this指針存在寄存器中。
- this指針是成員函數(shù)第一個(gè)隱含的指針形參,一般情況由編譯器通過(guò)ecx寄存器自動(dòng)傳遞,不需要用戶傳遞,
同時(shí),如果this指針為空時(shí),成員函數(shù)使用到了this指針,則會(huì)崩潰,如果沒(méi)使用,則正常運(yùn)行
總結(jié)
以上是生活随笔為你收集整理的类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Qt中出现段错误的原因分析
- 下一篇: 安农大计算机调剂,2020年安徽农业大学