C++Primer學習筆記------對象和類(1)

一、有關類的基本知識


1、類型

仔細想想,我們通常用什麼標準來判定一個數據的數據類型呢。有兩個,第一個是數據的存儲方式,比如char站一個自己,int佔四個自己,第二個就是這種類型能夠做的操作。比如整型數據可以做取餘操作,但是浮點數就不可以。

所以在定義一個變量的時候,我們通常完成了下面這幾件事:

(1)決定要爲這個類型的變量分配的內存

(2)決定如何解釋內存中的位,比如在定義數組的時候,在數組的索引+1時,到底是移動幾個內存單元,是根據這個數組元素的數據類型來確定的。

(3)決定了這個變量所能夠使用的方法。


PS:關於面向對象,關於類這個概念,我始終覺得,這是一個更高層次的抽象,其實我們現在使用的操作系統就已經是抽象了。爲什麼計算機的使用門檻越來越低,就是因爲抽象的層次越來越高,如果倒退幾十年,那時候的程序員是用匯編寫軟件的,直接和硬件打交道,哪裏有什麼狗屁VS編譯器這種東西呢。所以,C++中的面向對象和類的概念也是一樣,它把關於一個現實中的實體的一切屬性和方法都做了一個打包的操作,他在裏面會組織一些數據,給外部的用戶提供了一些接口。在你使用這個類之前,說明書上只有這個類用什麼功能,調用哪個函數,並沒有告訴你這個函數是怎麼實現的,從而降低了編程過程中很多的錯誤機率。就像我們日常生活一樣,我們都不知道我們吃進去的東西是怎麼在內部消化的,但是我們知道,只要是想吃東西,那就得用嘴這個“接口”,道理是一樣的對吧。


2、類

類通常有兩部分構成,一部分是類的聲明,另外一部分是類的定義,其實類的定義主要是對類的方法的一些定義。


3、類的訪問控制

類的訪問權限基本有三種,分別是公有的,私有的,被保護的。共有部分可以被外部對象訪問,被保護部分只能被子類訪問,私有部分只能被自己本身的這個類的內部訪問,其餘的地方均不能訪問。


4、關於類的成員方法

類的成員方法有兩個特點,第一個是聲明在類裏面,實現在類的外面,但是實現既然在類的外邊就得標識一下這個成員函數是屬於哪個類的,所以纔出現了利用作用域標識符來指定實現的成員函數所屬的類。

爲什麼非要加上作用域標識符來進行限定呢,因爲類裏面的函數也是有作用域的,這個作用域叫做類的作用域。如果兩個類同時定義了一個同名的update函數,那麼兩個函數在類的內部進行使用的時候,可以不加作用域標識符,並且即使同名也互不影響,因爲他們的作用域不同,但是在類的外面,就是不是他們所在的作用域了,需要對他們進行明確的限定是在哪裏定義的,屬於哪裏的。在類的成員方法中是可以訪問類的私有成員的,因爲只有類內部的函數才能夠訪問。


5、關於內聯函數

內聯函數在之前的博文裏面提到過,簡單來說就是在函數定義的時候在函數頭的最前面加上inline這個關鍵字,等到下次碰到調用它的時候,就直接把代碼複製過去,不會進行正常函數調用的那一系列的程序。在C++的類中,在類的聲明裏面定義的函數就默認爲內聯函數,因爲類的聲明通常來講都在頭文件中,並且在類的生命中定義的函數必定都會是比較短小精悍的那種,不然就違反了內聯函數的原則。如果你仍然準備在類中聲明函數原型,類的外部在定義函數,那麼在定義的時候就要加上inline這個關鍵字。

內聯函數的特殊規則決定了他必須在每個使用他的文件中都必須有相應的定義,所以最好的方式就是把內聯函數放在函數的頭文件中, 每個文件都引用這兒頭文件。 


6、方法&對象

我們都知道,一個類中的對象可以在類的外部調用類中的一些成員方法,成員方法只有一個,那麼在兩個對象都調用一個方法的時候,這個方法怎麼來判定函數中計算的數據是屬於哪個對象的呢。

很簡單,那個對象調用的方法,那麼這個方法裏面計算的數據就是屬於哪個對象的,每個對象在調用方法的時候,都會有一個相應的this指針來指向這個對象被傳遞進函數。所以在函數內部可以通過this->屬性的方式對這個對象相應的數據進行操作。


我們都知道,C++儘量把對象變爲普通的變量給我們進行使用,我們每次創建一個類的對象的時候,整個對象都會有自己的儲存空間,那麼一個類可以創建很多對象,如果這些對象都執行一個成員方法,那麼這個成員方法也是每個對象一個麼?不是的,類中的成員方法只有一個,而對象可以有很多,幾個對象在調用同一個成員方法的時候都會執行同一段代碼,只不過執行的數據不同。



PS:上面基本都是基礎知識,所以來一個小小的總結吧,先發出去,給大家看看。

要想使用一個類,就要先定義一個類,也就是對你要創建的 這個類進行一個完整的描述,具體類中的一些實現細節在聲明描述的時候不用太過擔心。首先要做的就是要寫一個類的聲明。通常來講,類的一些數據成員都放在私有部分中,一些成員方法都會放在公有部分中,當作是整個類的公有接口,這也是類設計的抽象部分。數據封裝到私有部分保證了數據的隱藏性,公有部分的成員方法實現了公有接口的抽象部分,成員函數的實現細節被封裝。

聲明玩一個類的時候,接下來就可以在類的外面實現一些類中聲明過的成員函數。出了內聯函數這種特殊的情況之外,其餘的函數都需要在類的外部加上作用域標識符進行具體的實現。

對於任何一個類的成員函數的函數名,都是有類名在裏面的,也就是說,類中的成員函數的函數名,不光包括我們自己定義的,還要加上類名,畢竟這個函數是屬於這個類的。用於定義的一個類,實際上就是用戶自定義了一個類型,所以纔有定義對象的時候直接,類名 對象名這種形式,這分明就是把類名當作了類型來看。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章