1、this指針
class Date
{
public:void Init(Date* this, int year, int month, int day){this->_year = year;this->_month = month;this->_day = day;this->Print();// ?這就是this指針,是編譯器自己加的,是用來讓成員函數找到成員變量的位置的;// ?this在實參和形參位置不能顯示寫,但在類里面可以顯示的用;cout << this << endl;}void Print(){cout << _year << endl;}private:int _year;int _month;int _day;
};
小擴展:
1)this指針存在哪?(棧、堆、靜態區、常亮區)
答:this是一個形參,一般是存在棧里面;有些編譯器(如VS)會優化,直接用寄存器加載;
2、類的6個默認成員函數
如果一個類中什么成員都沒有,簡稱為空類;
空類中真的什么都沒有嗎?其實并不是,任何類在什么都不寫時,編譯器也會自動生成6個默認成員函數;
默認成員函數的定義也就是用戶沒有顯式實現,編譯器會自動生成的成員函數;
六個默認成員函數:
- 初始化和清理:構造函數主要完成初始化的工作;析構函數主要完成清理工作;
- 拷貝復制:拷貝構造是使用同類對象初始化創建對象;賦值重載主要是把一個對象賦值給另一個對象;
- 取地址重載:主要是普通對象和const對象取地址,這兩個很少會自己實現;
構造函數:
構造函數是特殊的成員函數,需要注意的是,構造函數雖然名稱叫構造,但是構造函數的主要任務并不是開空間創建對象,而是初始化對象。
特征:1)函數名與類名相同;2)無返回值(void也不需要寫);3)對象實例化時編譯器自動調用對應的構造函數;4)構造函數可以重載(寫多個構造函數,提供多個初始化方式);
class Date
{
public:Date(){_year = 1;_month = 1;_day = 1;}Date(int year, int month, int day){_year = year;_month = month;_day = day;}// ?將上述兩個構造函數合并為一個全缺省構造函數,更為靈活;Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
}int main()
{Date dd; ?// ?此處注意不能寫成“Date dd()”,會識別成一個函數聲明的;dd.Print(); ?// ?咱們這里會發現dd已經被初始化為“1/1/1”了,如果沒有構造函數,這里出來的會是隨機值;Date dd2(2023, 01, 01);dd2.Print(); ?// ?此處輸出“2023/01/01”;return 0;
}