C++類和物件
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->。