1.類和對象
定義一個類:
class A
{
private:
int x, y, z;
void fun1(){};
public:
int a,b,c;
void fun2(){};
};
C++的限定符:public(公共)、private(私有、默認屬性)、protected(保護)。
對象實例化
A a;
或者A a(……);
不傳參是不能用括號,傳參時有括號,裏面放參數。
實例化後可以通過a.a,a.b,a.c,a.fun2等調用公共屬性的變量或函數,但是不能調用私有屬性的變量或者函數。
實例化後成員變量按照內存對齊原則,但是成員函數缺不佔空間。
若實例化一個空的類,則對象大小爲1,負責佔位,表示這個對象已經實例化。
2.四個默認成員函數
C++的類中,有六個默認成員函數:構造函數、拷貝構造函數、析構函數、賦值運算符重載函數、取地址操作符重載函數、const修飾的去地址操作符的重載函數。默認函數在類中沒有定義的時候會自動生成,默認是公有的,但是如果在類中定義了,就不會自動生成了。
我們今天來討論前四個:
先定義一個類
class Date
{
private:
int _date;
int _month;
int _year;
}
①構造函數
構造函數是在對象實例化時需要調用的函數。
構造函數無返回值,與類名同名。
默認構造函數是無參的:
Date(){}
可以自定義一個構造函數:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
這時,可以通過
Date d1;
Date d2(2017, 10, 07);
都能使對象實例化。
缺省的構造函數只能有一個(包括無參、全缺省和半缺省)
②拷貝構造函數
在實例化時可以:
Date d1(2017, 10, 07);
Date d2(d2); //通過拷貝析構函數
默認的拷貝構造函數:
Date(const Date& d)
{
this->_year = d._year;
this->_month = d._month;
this->_day = d._day;
}
在有動態開闢的傳指針時,不能用默認的拷貝構造函數。
③析構函數
析構函數用於清理對象。
~Date(){}
析構函數無參,不能重載。
在對象生命週期結束的時候會自動調用。
如果在程序裏,類中打開了文檔或者用了動態開闢,則需要手動寫析構函數。
④賦值運算符重載函數
Date& operator = (const Date& d)
{
if(this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
在實例化後可以
d1 = d2;
不能重載的運算符有:【.*】【::】【?:】【sizeof】【.】
3.隱含的this指針
在成員函數中對成員變量的引用,是按照this的指向找到對象的成員變量的,實現對數據成員的操作,簡單來說,在成員函數中,成員變量前都隱含着“this->”。
在運算符重載時,如:
Date& operator = (const Date& d)
{
if(this != &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
return *this;
}
this指針指的就是調用時的成員的指針,調用時d1 = d2,會轉化成d1.operator =(d2),則this指針則是指d1。而在if語句內,等號左邊的_year、_month、_day前都隱含着this->。