1. 程式人生 > >【C++】類和物件(2)

【C++】類和物件(2)

一、類的作用域

類定義了一個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員,需要使用 :: 作用域解析符
指明成員屬於哪個類域。否則找不到。

class person
{
public:
	void PrintfPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int _age;
};


//這裡需要指定PrintfPersonInfo是屬於person這個類域
void person::PrintfPersonInfo()
{
	cout << _name<<" " _gender <<" " _age << endl;
}

二、類的例項化

用類型別建立物件的過程,稱為類的例項化

1. 類只是一個模型一樣的東西,限定了類有哪些成員,定義出一個類並沒有分配實際的記憶體空間來儲存它

2. 一個類可以例項化出多個物件,例項化出的物件 佔用實際的物理空間,儲存類成員變數

3. 做個比方。類例項化出物件就像現實中使用建築設計圖建造出房子,類就像是設計圖,只設計出需要什
麼東西,但是並沒有實體的建築存在,同樣類也只是一個設計,例項化出的物件才能實際儲存資料,佔用物理空間

三、如何計算類物件的大小

class A
{
public:
	void PrintA()
	{
		cout << _a << endl;
	}
private:
	char _a;
};

int main()
{
	cout << sizeof(A) << endl;
	system("pause");
	return 0;
}

類中既可以有成員變數,又可以有成員函式,那麼上面這個A的大小是多少呢?

這是怎麼計算出來的呢?

       一個類的大小,實際就是該類中”成員變數”之和,當然也要進行記憶體對齊,注意空類的大小,空類比
較特殊,編譯器分配給了空類一個位元組來唯一標識這個類,佔位,表示物件存在過。

 

在這裡順便複習一下結構體記憶體對齊的規則

1. 第一個成員在與結構體偏移量為0的地址處。

2. 其他成員變數要對齊到某個數字(對齊數)的整數倍的地址處。

注意:對齊數 = 編譯器預設的一個對齊數 與 該成員大小的較小值。

VS中預設的對齊數為8,gcc中的對齊數為4

3. 結構體總大小為:最大對齊數(所有變數型別最大者與預設對齊引數取最小)的整數倍。

4. 如果嵌套了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是
所有最大對齊數(含巢狀結構體的對齊數)的整數倍。