類和物件(中)
阿新 • • 發佈:2018-12-18
類的6個預設成員函式
建構函式、拷貝建構函式、
解構函式、賦值操作符過載、
取地址操作符過載、const修飾的取地址操作符過載
1.建構函式
建構函式:(就是初始化函式)
(1)函式名與類名相同,無返回值
(2)建立物件時,編譯器自動呼叫對應的建構函式
(3)建構函式可以過載
(4)建構函式可以在類中定義,也可以在類外定義 (一般在類內) (5)如果沒有顯式定義建構函式,編譯器會自動生成一個無參的預設建構函式;反之,則使用使用者
定義的
類的成員變數放的時隨機值
*編譯器生成的建構函式有以下作用:
基本型別:int / char / double...陣列,(不處理);
自定義型別:class / struct / (呼叫自定義型別的建構函式)
(6)無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有一個
常用全預設
Date(int year = 2000, int month = 1, int day = 1) //全預設的建構函式 { _year = year; _month = month; _day = day; }
2.解構函式
解構函式(就是清理函式)
(1)在物件被銷燬時,編譯器自動呼叫,完成類的一些資源清理和汕尾工作
(2)函式名在類名前加上字元~,無引數,無返回值(一般做釋放空間的工作)
(3)一個類只有一個解構函式,若未顯式定義,系統會預設生成解構函式:
~Date(){}
(4)物件生命週期結束時,系統會自動呼叫解構函式
注意:解構函式體內不是刪除物件,而是做一些刪除物件前的清理工作
(5)一般自定義時可以在函式中釋放動態開闢的空間
3.拷貝建構函式
拷貝建構函式(也是一種建構函式的過載)
(1)只有單個形參,該形參是對本類物件的引用(一般用const修飾),用已存在的物件建立新物件
時,編譯器自動呼叫
Date(const Date& d){}
注意:如果不加&會造成無限遞迴問題,因為d又是一個實體的拷貝
(2)若未顯式定義。系統會預設生成拷貝建構函式
,這個函式會按照成員的宣告順序依次將其初始化(這就是淺拷貝)
淺拷貝:按位元組進行賦值,因此不能拷貝指標,這樣會導致兩個物件的成員指標指向同一塊空
間,造成錯誤
4.賦值運算子過載(增強程式碼可讀性)
賦值運算子過載 格式:返回值型別 operator 需要過載的操作符(引數列表) Date& operator=(const Date& d) //運算子過載,返回引用,可以支援連等 { if (this != &d) { this->_year = d._year; this->_month = d._month; this->_day = d._day; } return *this; } 注意:一個類如果沒有顯式的定義賦值運算子過載,編譯器也會實現一個,完成值的拷貝工作
5.取地址及const取地址操作符的過載
這兩個預設成員函式一般不用重新定義,編譯器會自動預設生成
class Date
{
public:
Date* operator& ()
{
return this;
}
const Date* operator& () const //後邊的const修飾this指標
{
return this;
}
private:
int _year;
int _month;
int _day;
};
注意:編譯器會自動生成這兩個函式,只有特殊情況下,才需要過載,例如讓別人獲取到指定內容
6.const成員
6.1const 修飾普通變數
在C++中,const修飾的變數已經為一個常量,具有巨集的屬性,即在編譯期間,編譯器會將const所修飾的常量進行替換
const Date* p1; // 修飾 *p1
Date const *p2; //修飾 *p2
Date* const p3; //修飾 p3
6.2const修飾類的成員函式
將const修飾的類的成員函式稱為const成員函式,const修飾類的成員函式,實際是修飾該成員函式隱含的this指標,表明在該成員函式中不能對類的任何成員進行修改
int main()
{
const Date d1(2018,10,28);
d1.Display(); //const物件可以呼叫const成員函式
d1.Print(); //const物件不能呼叫非const成員函式
Date d2(2000, 6, 12);
d2.Print(); //非const物件可以呼叫非const成員函式
d2.Display(); //非const物件可以呼叫const成員函式
//const成員函式內可以呼叫其它的const成員函式,但不能呼叫非const成員函式
//非const成員函式內可以呼叫其它的const成員函式和非const成員函式
}
class Date
{
public:
void Print()
{
cout << "i am print!" << endl;
}
void Display() const
{
test();
cout << "i am display!" << endl;
}
void test() const
{
cout << "i am test!" << endl;
}
}