<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在引入類之前,先來回憶一下C語言中的結構體。結構體是一種自定義型別,可以在其中定義變數,如我們所熟悉的日期結構體:
struct Date { int year; int month; int day; };
而在C++中,結構體被升級成了類,結構體中不僅可以定義成員變數,也可以定義成員函數(成員方法):
struct Date { //成員變數 int year; int month; int day; //成員方法 void print() { cout << year << "-" << month << "-" << "day" << endl; } };
在C++中,更喜歡使用class來替代struct,當然它們也有所差別,在之後會說明。
類的定義可以分為兩種,即宣告和定義全部放在類體中與宣告與定義分離。
該方式即為上一舉例程式碼的定義方式。但要注意,如果採用這種方法定義成員函數,編譯器可能會將該函數作為行內函式處理。
標頭檔案中成員函數只需要宣告:
struct Date { //成員變數 int year; int month; int day; //成員方法 void print(); };
在原始檔中對函數進行定義:
void Date::print() { cout << year << "-" << month << "-" << "day" << endl; }
需要注意,print為類域中的函數,如果不加Date::用以指定類域,會導致定義出錯。因此,使用該方式定義成員函數時,一定要注意指定類域。
存取限定符分為三種:
(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函數中可以直接對物件中的成員變數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函數中對直接物件中的成員變數day進行存取,會導致錯誤
(3)存取許可權作用域是從該存取限定符的位置開始直到下一個存取限定符出現時為止
class Date { private: int year; int month; int day; public: void print() { cout << year << "-" << month << "-" << "day" << endl; } };
如上程式碼,成員變數均為私有的,而成員函數print為公有的。
(4)class的預設存取許可權(即不寫存取限定符時)為private,struct為public
封裝實際上是一種更好的嚴格管理
將資料和方法封裝到類裡,可以存取的定義為共有,不想給他人存取的定義為私有或保護。如此一來就做到了隱藏物件的屬性和細節,僅僅對外公開介面來和物件進行互動,更加安全高效。
所謂類的範例化,簡而言之就是用類型別建立物件的過程。
打個比方,類就好似建築的圖紙,而物件就是根據圖紙造出的建築。物件是真實存在摸得著的,只有範例化出的物件才能夠實際儲存資料。
學過C語言我們知道如何計算結構體的大小,那麼在C++中,類的大小如何確定呢?
我們所不清楚的,就是類中成員函數的大小如何計算。實事上對於同一類的不同物件,處理問題的方法是相同的,如果每個物件都要儲存一遍成員方法,未免有些過於浪費空間了。
因此在C++中,成員函數存放在公共程式碼段。計算類的大小隻需要按照C語言中結構體大小的計算規則即可,不需要考慮成員函數。
注意:空類的大小為1byte,不儲存有效資料,但需要佔位用以表示物件存在。
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這兩個物件分別都呼叫了init進行初始化,那麼init函數是如何區分該為哪個物件進行初始化的呢?
C++通過引入this指標解決了這個問題。
1、this指標的型別:類型別* const,存放物件的地址
2、只能在成員函數內部使用
3、this指標本質上是成員函數的形參,傳參時存放在棧幀中,物件中不儲存this指標
4、this指標為隱藏的形參,不需要使用者傳遞
在上述程式碼實際被處理成了這樣:
void init(int year, int month, int day) { this->_year = year; this->_month = month; this->_day = day; }
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45