1.struct和class
與C語言不同的是,C++中struct和class可以定義成員變量和成員函數。更偏好用class。
2.類的定義
格式如下:
? ? ? ? class 為 定義類的 關鍵字, ClassName 為類的名字, {} 中為類的主體,注意 類定義結束時后面 分 號不能省略 。
class className
{
// 類體:由成員函數和成員變量組成
}; ?// 一定要注意后面的分號
3.類的訪問限定符
public、protected、private
【訪問限定符說明】
1. public 修飾的成員在類外可以直接被訪問
2. protected 和 private 修飾的成員在類外不能直接被訪問 ( 此處 protected 和 private 是類似的 )
3. 訪問權限 作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現時為止
4. 如果后面沒有訪問限定符,作用域就到 } 即類結束。
5. class 的默認訪問權限為 private , struct 為 public( 因為 struct 要兼容 C)
問題: C++ 中 struct 和 class 的區別是什么?
解答: C++ 需要兼容 C 語言,所以 C++ 中 struct 可以當成結構體使用。另外 C++ 中 struct 還可以用來
定義類。和 class 定義類是一樣的,區別是 struct 定義的類默認訪問權限是 public , class 定義的類
默認訪問權限是 private 。注意:在繼承和模板參數列表位置, struct 和 class 也有區別,后序給大
家介紹。
面向對象的三大特性:封裝、繼承、多態
封裝本質上是一種管理,隱藏對象的屬性和現實細節,僅對外公開接口來與對象進行交互。
4.類的作用域
類定義的新作用域簡稱類作用域。在類外定義成員時,需要使用::操作符指明對象所屬的類操作域。
class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int ?_age;
};
// 這里需要指定PrintPersonInfo是屬于Person這個類域
void Person::PrintPersonInfo()
{cout << _name << " "<< _gender << " " << _age << endl;
}
5.類的實例化
注意:類本身并沒有分配實際的內存空間,實例化后才占用實際的物理空間。
一個類可以實例化多個對象。
6.類對象模型
一個類的大小,實際上只計算該類中成員變量。注意計算時運用內存對齊。
內存對齊規則:
1. 第一個成員在與結構體偏移量為 0 的地址處。
2. 其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。
注意:對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。
VS 中默認的對齊數為 8
3. 結構體總大小為:最大對齊數(所有變量類型最大者與默認對齊參數取最小)的整數倍。
4. 如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整
體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。
為什么要內存對齊?為了提高效率。
編譯器一次性一般讀取4或8字節,從整數倍開始讀。如果不內存對齊,一個數據就要讀取兩次,效率較低。