類和對象1

前言

在c語言中沒有類,但是有結構體結構體中只能定義變量,不能定義函數但是在c++中,結構體多了可以定義函數的能力,並且c++中多了一個限定符的概念即結構體的成員是有訪問權限的:public,protected,private,再沒有特別聲明的情況下,結構體的成員默認爲public,並且在使用結構體時候,在定義結構體變量時也不需要再加上一個struct的關鍵字了。但是c++中習慣用class,因爲c++中class幾乎和結構體一樣,只是class的成員默認的訪問權限是private.

限定符

訪問限定符只在編譯時有用,當數據映射到內存後,沒有任何訪問限定符上的區別
看代碼:類A中有一個int類型的私有成員變量,dat。

A a(1);
int *p = a.getaddr();//得到a中dat的地址 
cout<<a.getvalue()<<endl;
*p=2;
cout<<a.getvalue()<<endl;//到到a中dat的值 
return 0;

代碼的結果是輸出:
1
2
可以證實,限定符只是語法上的問題,即編譯時會檢查有一些訪問是否合法,但是我們依然通過地址在類外直接訪問或者修改私有變量。
引用>

  1. public修飾的成員在類外可以直接被訪問
  2. protected和private修飾的成員在類外不能直接被訪問(此處protected和private是類似的)
  3. 訪問權限作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現時爲止
  4. class的默認訪問權限爲private,struct爲public(因爲struct要兼容C)

c++中struct和class的區別是什麼?

解答:C++需要兼容C語言,所以C++中struct可以當成結構體去使用。另外C++中struct還可以用來定義類。和class是定義類是一樣的,區別是struct的成員默認訪問方式是public,class是struct的成員默認訪問方式是private。

封裝的理解

面向對象的三大特性:封裝,繼承,多態
封裝:將數據和操作數據的方法有機結合,隱藏對象的屬性和實現細節,僅對外公開接口來和對象進行交互。
兵馬俑的例子:
管理兵馬俑,不能大家隨便看呀,這樣兵馬俑就可能被破壞了,我們首先得建房子保護起來,然後設置一個接口訪問,其實就是售票口,並且訪問時候也要遵守制定好的規則,合理的看兵馬俑,要隔着一個玻璃牆。
操作系統中的例子:
操作系統的中系統調用實際上就是封裝好的,爲什麼封裝呢,因爲首先需要保護內核中的數據,如果我們直接操作內核中數據是不安全的,我們可能有些細節注意不到,導致不合理的操作,系統調用就把實現細節做好,並且不會導致對系統的不安全,這就是封裝的意義。

類的作用域

作用域解析符 ‘::’
這個其實和名字空間又扯上關係了
可以定義名字空間來防止變量重名導致的問題
如果要體現C++代碼風格,作用域算一個

類的實例化

說到類,當我們定義一個類之後比如在main函數的前面寫上一段代碼
class A
{

};
注意:上面的代碼只是一個聲明,告訴操作系統有這個類,並且給了操作系統一張圖紙,就和建房子先要一張房子的圖紙一樣。類的實例化叫做這個類的對象,對象是根據類這個圖紙創建出來了,這張圖紙可以創建多個對象同樣的可以用一張房子的圖紙造出許多一樣的房子。

計算類對象的大小

在沒有虛函數的前提下
實際上,一個類的大小,實際就是該類"成員變量"之和,當然也要進行內存對齊,注意空類的代銷,空類比較特殊,編譯器給了空類一個字節來唯一標識這個類。

引用>

結構體內存對齊規則

  1. 第一個成員在與結構體偏移量爲0的地址處。
  2. 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。
    注意:對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。
    VS中默認的對齊數爲8,gcc中的對齊數爲4
  3. 結構體總大小爲:最大對齊數(所有變量類型最大者與默認對齊參數取最小)的整數倍。
  4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是
    所有最大對齊數(含嵌套結構體的對齊數)的整數倍

結構體爲什麼要進行對齊
1.提高訪問效率
2.和硬件相關,cpu每次讀取的內存都是整數倍,如果內存不對齊就可能讀一個數據要讀兩次的情況
如何讓結構體按照指定的對齊參數進行對齊
#pragma pack(1)
設置默認對齊數爲1
如何知道結構體中某個成員相對於結構體起始位置的偏移量
地址相減即可
&a.dat-&a
什麼是大小端?如何測試某臺機器是大端還是小端,有沒有遇到過要考慮大小端的場景
測試方法
聯合結構體法
指針法
場景:
比如說代碼的移植

this指針

C++中通過引入this指針解決該問題,即:C++編譯器給每個“成員函數“增加了一個隱藏的指針參數,讓該指針指向當前對象(函數運行時調用該函數的對象),在函數體中所有成員變量的操作,都是通過該指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動完成。
指針的特性

  1. this指針的類型:類類型* const
  2. 只能在“成員函數”的內部使用
  3. this指針本質上其實是一個成員函數的形參,是對象調用成員函數時,將對象地址作爲實參傳遞給this形參。所以對象中不存儲this指針。
  4. this指針是成員函數第一個隱含的指針形參,一般情況由編譯器通過ecx寄存器自動傳遞,不需要戶
    傳遞
    this指針存在哪裏
    當然是成員函數裏面咯
    this指針可以爲空嗎
    當然可以,如果一個函數不需要開闢堆棧空間,是可以直接通過類名調用的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章