1. 程式人生 > >類和物件(中)

類和物件(中)

類的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;
	}
    
}

注意:const成員函式中一定要修改某個成員變數,可以在該成員變數前加 mutable 關鍵字