C++類與對象2

目錄

1.類的對象大小的計算

2.類成員函數的this指針

本篇講述以上類容

類的對象大小計算

在C語言中,結構體中的成員變量,滿足內存對齊原則,具體內存對齊原則,在我之前講的C語言結構體中有詳細說明,這裏就不多說了內存對齊原則
那麼,C++中的類,也滿足內存對齊原則,比如:

class person
{
	int _a;
	char _b;
	double _c;
};
int main()
{
	person _A;
	cout<<sizeof(_A)<<endl;
}

運行結果如下,這裏默認對齊數爲8。
在這裏插入圖片描述
不難看出,與struct中對齊規則是一致的。那麼如果類中嵌套定義一個類呢?比如:

class person
{
public:
	int _a;
	char _b;
	double _c;
	class _number
	{
		int _e;
		char _f;
		double _h;
	};
};
int main()
{
	person _A;
	cout<<sizeof(_A)<<endl;;
}

這裏,就是需要注意的,結果仍然爲16
在這裏插入圖片描述
這是因爲我們在person這個類中。沒有定義_number這個類的變量,所以,編譯器是不會計算_number這個類中的變量大小,但如果改成下面形式

class person
{
public:
	int _a;
	char _b;
	double _c;
	class _number
	{
		int _e;
		char _f;
		double _h;
	};
	_number _B;//定義_number類類型的一個變量
};
int main()
{
	person _A;
	cout<<sizeof(_A)<<endl;;
}

結果顯而易見爲32
在這裏插入圖片描述
我們再看以下例子:

#include<iostream>
using namespace std;
class A1//含有成員變量和成員函數
{
public:
	int _a;
	void fun()
	{};
};
class A2//只含有成員函數
{
	void fun()
	{};
};
class A3//空類
{};
int main()
{
	cout<<sizeof(A1)<<endl;
	cout<<sizeof(A2)<<endl;
	cout<<sizeof(A3)<<endl;
}

輸出結果如下:
在這裏插入圖片描述
至此我們得出結論:
1.類滿足內存對齊原則。
2.嵌套類本身也遵循內存對齊的原則
3.類中只保存成員變量,成員函數存放在公共的代碼段(成員函數不佔字節數)
4.空類較特殊,編譯器給了空類一個字節來唯一標識這個類

類成員函數的this指針

我們先看下面這個類的定義

class A1
{
public:
	void set(int a = 1,double b = 0.1)
	{
		_a = a;
		_b = b;
	}
	void display()
	{
		cout<<_a<<" "<<_b<<endl;
	}
private:
	int _a;
	double _b;
};
int main()
{
	A1 A,B;
	A.set(10,10.5);
	B.set(15,15.5);
	A.display();
	B.display();
}

我們在main函數中定了兩個對象A,B。A1這個類中的兩個成員函數並沒有關於不同對象的區分,那麼當A調用set的時候,set函數是如何知道設置A這個對象,而不設置B這個對象的呢?
這就有了this指針的引入:
C++中通過引入this指針解決該問題,即:C++編譯器給每個“非靜態的成員函數“增加了一個隱藏的指針參數,讓該指針指向當前對象(函數運行時調用該函數的對象),在函數體中所有成員變量的操作,都是通過該指針去訪問。只不過所有的操作對用戶是透明的,即用戶不需要來傳遞,編譯器自動完成。
上述display()就等價於:

	void display()
	{
		cout<<this->_a<<" "<<this->_b<<endl;
	}

其中this指向的就是當前調用display函數的對象的地址,作爲成員函數的形參。
這裏爲大家總結一下this指針的特性:

  1. this指針類型爲const* 類型
  2. this指針只能在成員函數內部使用
  3. this指針本質上其實是一個成員函數的形參,是對象調用成員函數時,將對象地址作爲實參傳遞給this 形參。所以對象中不存儲this指針
  4. this指針是成員函數所隱藏的第一個指針形參
  5. this指針是通過編譯器傳遞,不需要顯式定義它
  6. this不是類的成員,只是一個函數形參
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章