c++對象
對象的大小
常規
初學c++的時候,我們經常對類實際的大小感到困惑,當類中即有成員和函數的時候,這個類的大小到底是多大呢?我們可以使用sizeof來查看
類對象的大小。
#include<iostream>
#include<stdio.h>
using namespace std;
class B{
private:
int b;
public:
int getB(){
return b;
}
};
int main(){
B b;
printf("size of B: %d\n", sizeof(b));
}
這個類的大小輸出是4,那麼由此我們可以知道類中的函數是不佔類的大小的。
特殊
那麼有一下幾種特殊情況,我們思考類的大小是多少呢?
- 空類
- 空結構體
- 類中只有成員函數,沒有變量
#include<iostream>
#include<stdio.h>
using namespace std;
//空結構體A大小是1
typedef struct A{
// int a;
};
//空類B的大小是1
class B{
};
//有一個函數的類的大小是1
typedef struct C{
void test(){
}
};
int main(){
A a;
B b;
C c;
printf("size of A: %d\n", sizeof(a));
printf("size of B: %d\n", sizeof(b));
printf("size of C: %d\n", sizeof(c));
}
我們發現這三種情況類的大小都是1,對於編譯器而言,只是給了一個佔位符。
this指針
在學習c++的類或者結構體的時候,我們發現存在一個this指針,可以通過this指針來訪問類對象中的成員以及函數,那麼this指針到底是什麼呢?
- this指針是編譯器生成的,放在寄存器裏面的。調用類成員函數的時候會把this指針傳入到函數中去。因此成員函數中可以通過this指針操作類成員
- this指針本質上是結構體或者類的首地址。
- this指針不在類裏面,不佔用類的大小。
- this指針不能++,不能–,不能重新賦值。
構造函數
構造函數是編譯器幫我們自動調用的,在生成新的類對象的時候。
構造函數作用:
- 初始化類的成員
構造函數特點:
- 編譯器自動生成無參構造
- 構造函數可以重載
- 構造函數名字和類名一樣
- 構造函數無返回值
析構函數
析構函數是編譯器幫我們自動調用的,在類銷燬的時候。
析構函數的作用
- 釋放資源(打開的文件,內存)
RAII
RAII 是c++管理資源的方式,是依賴構造函數和析構函數來實現的。
繼承的本質
繼承的本質是數據的拷貝。
我們都知道 子類繼承父類,生成子類對象的時候,編譯器會幫我們調用父類的構造函數來生成父類,實際上編譯器幫我們做的事情是把父類的數據拷貝到子類數據存放的前面,並且生成this指針。
實際上子類的成員和父類的成員是放在一起的,因此在子類中都可以通過this指針偏移來訪問到。
我們都知道子類對象付給父類指針的時候,父類沒辦法訪問到子類的成員,但是由於數據是排列在一起的原因,我們可以欺騙編譯器訪問到數據
這個是不安全的,只是想證明子類繼承父類,那麼子類對象的數據和父類對象的數據其實是放在一起的。