文章目錄
-
-
- 1.類的定義
- 2.通路限定符和封裝
-
- 2.1 通路限定符
- 2.2C++中struct和class的差別是什麼?(面試題)
- 2.3封裝
- 3.類的作用域
- 4.類的執行個體化
- 5.類對象模型
-
- 5.1計算類對象的大小
- 6.this指針
-
- 6.1this指針的特性
- 6.2 this指針存在那裡?(面試題)
- 6.3this指針可以為空嗎?(面試題)
-
1.類的定義
class className
{
// 類體:由成員函數和成員
}; // 一定要注意後面的分号
class為定義類的關鍵字,ClassName為類的名字,{}中為類的主體,注意類定義結束時後面分号。
類中的元素稱為類的成員:
類中的資料稱為類的屬性或者成員變量;
類中的函數稱為類的方法或者成員函數。
定義方式:
- 聲明和定義全部放在類體中。
class student
{
public:
//顯示資訊
void showInfo()
{
cout << _name << "-" << _age << endl;
}
public:
char* _name;//姓名
int _age;//學号
};
- 聲明放在.h檔案中,定義放在.cpp檔案中
student.h檔案——聲明
class student
{
public:
//顯示資訊
void showInfo();
public:
char* _name;//姓名
int _age;//學号
};
.cpp檔案——定義
#include "student.h"
void student::showInfo()
{
cout << _name << "-" << _age << endl;
}
2.通路限定符和封裝
2.1 通路限定符
通路限定符:public(共有)、protected(保護)、private(私有)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB9kMnpXTwcGRNFDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4EjMzEDN1QTMyAjMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
- public修飾的成員在類外可以直接被通路
- protected和private修飾的成員在類外不能直接被通路(此處protected和private是類似的)
- 通路權限作用域從該通路限定符出現的位置開始直到下一個通路限定符出現時為止
- 通路限定符隻在編譯時有用,當資料映射到記憶體後,沒有任何通路限定符上的差別
2.2C++中struct和class的差別是什麼?(面試題)
- C++需要相容C語言,是以C++中struct可以當成結構體去使用。另外C++中struct還可以用來定義類。和class是定義類是一樣的,差別是struct的成員預設通路方式是public,class是struct的成員預設通路方式是private。
2.3封裝
面向對象的三大特性:封裝、繼承、多态。
封裝:将資料和操作資料的方法進行有機結合,隐藏對象的屬性和實作細節,僅對外公開接口來和對象進行互動。
封裝:封裝本質是一種管理,将資料和方法放到一起定義,把不想讓别人看到的用protect/private封裝起來,想給你看到的用public定義。
3.類的作用域
類定義了一個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員,需要使用 :: (作用域解析符)指明成員屬于哪個類域。
class Student
{
public:
void showInfo();
private:
char _name;
char _sex;
int _age;
};
// 這裡需要指定showInfo是屬于Person這個類域
void Student::showInfo()
{
cout << _name << " " << _sex << " " << _age << endl;
}
4.類的執行個體化
用類類型建立對象的過程,稱為類的執行個體化。
類執行個體化出對象,就相當于定義出了類的成員變量。
5.類對象模型
5.1計算類對象的大小
- 成員函數存在公共的代碼段。
- 類中既有成員變量,又有成員函數,但是在計算大小時,隻考慮成員變量。(多個成員時,需要記憶體對齊)
- 空類的大小是1個byte(編譯器給了空類一個位元組,是為了占位,表示執行個體化出的對象存在)。
6.this指針
C++編譯器給每個非靜态的成員函數增加了一個隐藏的指針參數,讓該指針指向目前對象(函數運作時調用該函數的對象),在函數體中所有成員變量的操作,都是通過該指針去通路。這個指針就是this指針。
6.1this指針的特性
- this指針的類型:類類型* const
- 隻能在“成員函數”的内部使用
- this指針本質上其實是一個成員函數的形參,是對象調用成員函數時,将對象位址作為實參傳遞給this形參。是以對象中不存儲this指針。
- this指針是成員函數第一個隐含的指針形參,一般情況由編譯器通過ecx寄存器自動傳遞,不需要使用者傳遞。
C++——類和對象(上)
6.2 this指針存在那裡?(面試題)
因為this指針是隐含的形參,是以存在棧(棧幀)裡。vs下為了提高效率,this存在了ecx寄存器。
6.3this指針可以為空嗎?(面試題)
// 1.下面程式能編譯通過嗎? 能通過
// 2.下面程式會崩潰嗎?在哪裡崩潰
會崩潰,在PrintA()裡輸出this->_a解引用時崩潰了。
class A
{
public:
void PrintA()
{
cout<<_a<<endl;
}
void Show()
{
cout<<"Show()"<<endl;
}
private:
int _a;
};
int main()
{
Date* p = NULL;
p->PrintA();
p->Show();
}
p是空指針,調用函數為什麼沒崩?
因為成員函數存在公共代碼段,沒有存在成員對象中,這裡調用沒有對p進行解引用。