類與對象(一)中,簡單從類的定義、類的訪問限定符、類的作用域、類對象模型、this指針五個方面梳理下。
1. 類的定義
- C語言中,結構體中只能定義變量,在C++中,結構體內不僅可以定義變量,也可以定義函數。
- C++兼容C語言結構體的一切用法;將stuct也可以當成定義函數。
- class爲定義類的關鍵字,className爲類的名字,{}中爲類的主體,注意類定義結束時後面分號。
- 類中的元素稱爲類的成員;類中的數據稱爲類的屬性或者成員變量; 類中的函數稱爲類的方法或者成員函數。
class className
{
// 類體:由成員函數和成員變量組成
}; // 一定要注意後面的分號
類的定義的兩種方式:
//聲明和定義全部在類體內
class person
{
public:
void show();
private:
char* _name;
char* _sex;
int _age;
};
//聲明放在.h中,類的定義放在.cpp中
#include "person.h"
void person::show()
{
cout << _name << "-" << _sex << "-" << _age << endl;
}
2. 類的訪問限定符
【訪問限定符說明】
1. public修飾的成員在類外可以直接被訪問 ;
2. protected和private修飾的成員在類外不能直接被訪問;
3. 訪問權限作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現時爲止;
4. class的默認訪問權限爲private,struct爲public(因爲struct要兼容C);
3. 類的作用域
- 類定義了一個新的作用域,類的所有成員都在類的作用域中。在類體外定義成員,需要使用 :: 作用域解析符 指明成員屬於哪個類域。
class Person
{
public:
void PrintPerson();
private:
char _name[20];
char _gender[3];
int _age;
};
// 這裏需要指定PrintPerson是屬於Person這個類域
void Person::PrintPerson()
{
cout<<_name<<" "_gender<<" "<<_age<<endl;
}
4. 類的對象模型
4.1 計算類對象的大小
- 計算類對象的大小,只計算類成員變量,不計算成員函數,進行內存對齊;空類的大小爲1。
class A
{
public:
void PrintA()
{
cout << _a << endl;
}
private:
char _a;
};
int main()
{
cout << sizeof(A) << endl; //1
A a;
cout << sizeof(a) << endl; //1
system("pause");
return 0;
}
4.2 結構體內存對齊規則
-
第一個成員在與結構體偏移量爲0的地址處;
-
其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處;
注意:對齊數 = 編譯器默認的一個對齊數 與 該成員大小的較小值。
VS中默認的對齊數爲8,gcc中的對齊數爲4 -
結構體總大小爲:最大對齊數(所有變量類型最大者與默認對齊參數取最小)的整數倍;
-
如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍。
5. this指針
class Date
{
public:
void Display ()
{
cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}
void SetDate(int year , int month , int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year ; // 年
int _month ; // 月
int _day ; // 日
};
int main()
{
Date d1, d2;
d1.SetDate(2018,5,1);
d2.SetDate(2018,7,1);
d1.Display();
d2.Display();
return 0;
}
C++編譯器給每個“成員函數“增加了一個隱藏的指針參數,讓該指針指向當前對象;
在函數體中所有成員變量的操作,都是通過該指針去訪問;
用戶不需要來傳遞,編譯器自動完成。
this指針的特性:
- 只能在“成員函數”的內部使用;
- this指針本質上其實是一個成員函數的形參,是對象調用成員函數時,將對象地址作爲實參傳遞給this 形參,所以對象中不存儲this指針;
- this指針是成員函數第一個隱含的指針形參,一般情況由編譯器自動傳遞,不需要用戶傳遞。