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->。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章