更高階的C++,Qt物件模型
今天我們來看看Qt的物件模型,但在講述之前,先來看看C++物件模型。
1 C++物件模型
學習過C語言的同學都知道,在C語言中,資料和函式是分開的,也就是說,語言本身並沒有支援“資料和函式”之間的關聯性。
而在C++中,通過類的概念,將資料與函式相關聯,資料稱之為屬性,函式稱之為方法(介面)。
方法提供了訪問屬性的介面。
將資料與介面關聯起來的過程,我們稱之為封裝。在封裝的過程中,我們將該類所能夠提供的服務或者說是介面,對外宣告為public,將本身的屬性宣告為private。
計算機本身是不支援什麼公有私有之說,它只認識0和1,而這些特性都是由編譯器來控制完成的。那麼,想要編譯器支援public,private等宣告,那就需要建立一個有效的模型概念,我們則稱之為物件模型。
物件模型主要做兩方面的事情,一個是直接支援面向物件程式設計,一個是支援各種的底層實現。
如果再有面試官問你C++和C語言的區別,就沒必要直接扯封裝,繼承,多型,你完全可以從編譯器的物件模型來分析概述這些特性,面試官必然是對你刮目相看,也可使你在眾多面試者中脫穎而出。
2 簡單物件模型
下面小豆君介紹一個簡單物件模型
先定義一個學生類:
class Student { public: Student(); ~Student(); int getAge(); private: int age; };
下圖是簡單物件模型原理:

image
在stu這個例項中,所有成員並不存放在stu內,stu記憶體放的是每個成員的地址,因為地址的大小固定,所以可以通過索引值來找到這個地址,然後通過該地址訪問到stu中的真正成員。例如,可以通過stu的首地址+4,找到成員變數int Student::age的地址,然後訪問它。
如果想深入瞭解這方面知識,推薦研讀《深度探索C++物件模型》,作者是參加設計了第一套C++編譯器cfront的Lippman,書比較難懂,初學者不推薦,你只需要知道C++的這些特性是通過編譯器物件模型支援實現的就可以了,C++的名字較之C多了個++,也是表明它在C的基礎上更進一步。
3 Qt物件模型
如果說C++的物件模型是在C的基礎上更進一步,那麼Qt的物件模型就是在C++的基礎上更進一步。下面的列表便是Qt中的獨有特性,它能夠幫助你更靈活舒服的使用C++,在以後的分享中,小豆君會詳細介紹每個特性。
-
訊號和槽,一個非常強大的機制,用於無縫的物件通訊。
-
可查詢和可設計的物件屬性系統,支援靜態和動態兩種模式,動態屬性相當於在程式執行過程中,臨時為你的類新增一個成員變數。
-
強大的事件機制和事件過濾器。
-
國際化的上下文字串翻譯。
-
複雜的間隔驅動計時器,使它能夠在事件驅動的GUI中優雅地整合許多工。
-
層次結構和可查詢物件樹以一種自然的方式組織物件所有權,利用這個特性在很大程度上可以解決C++程式設計師對於指標釋放的困惑。
-
守護指標(QPointer),當被引用的物件被銷燬時,它會自動設定為0,不像普通的c++指標,當物件被銷燬時,它會變成懸空指標。
許多Qt特性都是通過標準C++技術實現的,基於QObject的繼承。所以想要使用Qt的這些特性,必須繼承QObject,並且加入巨集Q_OBJECT。所以,如果你是使用Qt程式設計,強烈推薦這樣的宣告方法。
class Student: public QObject { Q_OBJECT public: Student(){} };
其他的,如物件通訊機制和動態屬性系統,需要由Qt自己的元物件編譯器(moc)提供的元物件系統。
元物件系統是一個C++擴充套件,使語言更適合於真正的元件GUI程式設計。
想要加入C++/Qt交流群的小夥伴,可以在控制檯輸入“我要加群”,按照提示入群。
這次的分享就到這兒了,我們下次見。
最後也希望大家多多支援小豆君的創作,關注小豆君的公眾號“小豆君Qt分享”,最新文章都會在公眾號第一時間釋出,或者你有不懂的問題,關注公眾號後,可加好友或進Qt群獲得答案。