C 類和物件(中)

2021-10-19 06:53:58 字數 3542 閱讀 3188

目錄

1.建構函式

2.析構函式

3.拷貝建構函式

4.賦值運算子的過載

5.const成員

6.取位址及const取位址操作符過載

乙個類中,如果沒有任何成員,稱為空類。任何乙個類中,都會包含6個預設的成員函式,即使是空類也會自動生成6個預設成員函式,如下為類中的6個預設成員函式:

注意:預設成員函式如果不寫編譯器會自動生成,如果寫了編譯器就不在生成而是使用我們自己寫的。

建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員都有 乙個合適的初始值,並且在物件的生命週期內只呼叫一次。

class  date

private:

int _hour;

int _minute;

int _second;

};class date

;int main()

析構函式與建構函式功能相反,析構函式不是完成物件的銷毀,區域性物件銷毀工作是由編譯器完成的。而物件在銷毀時會自動呼叫析構函式,完成類的一些資源清理工作。

//順序表中的析構函式

~seqlist()

}

析構函式的特性

1) 析構函式名是在類名前加上字元 ~。

2) 無引數無返回值。

3) 乙個類有且只有乙個析構函式。若未顯式定義,系統會自動生成預設的析構函式。

4) 物件生命週期結束時,c++編譯系統系統自動呼叫析構函式。

5)關於編譯器自動生成的析構函式,是否會完成一些事情呢?下面的程式我們會看到,編譯器生成的預設析構函式,對會自定型別成員呼叫它的析構函式(與建構函式相似)。

拷貝建構函式只有單個形參,該形參是對本類型別物件的引用(一般常用const修飾),在用已存在的類型別物件建立新物件時由編譯器自動呼叫。

//日期類中的拷貝建構函式

date(const date& d)

//拷貝建構函式的使用舉例

int main()

拷貝建構函式的特性

1) 拷貝建構函式是建構函式的乙個過載形式。//函式名與類名相同(與建構函式名也相同)

2) 拷貝建構函式的引數只有乙個且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫。

3)若未顯示定義,系統生成預設拷貝建構函式。 預設的拷貝建構函式物件按記憶體儲存按位元組序完成拷貝,這種拷貝我們叫做淺拷貝,或者值拷貝。

4)那麼編譯器生成的預設拷貝建構函式已經可以完成位元組序的值拷貝了,我們還需要自己實現嗎?當然像日期類這樣的類是沒必要的。那麼下面的類呢?

// 這裡會發現下面的程式會崩潰掉?這裡就需要我們以後講的深拷貝去解決。

class string

~string()

private:

char* _str;

};int main()

1)運算子過載c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值型別,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。

函式名字為:關鍵字operator後面接需要過載的運算子符號。

函式原型:返回值型別 operator操作符(引數列表)

例如:

bool  operator>(引數列表)

// bool operator==(date* this, const date& d2)

// 這裡需要注意的是,左運算元是this指向的呼叫函式的物件

bool operator==(const date& d2)

private:

int _year;

int _month;

int _day;

};void test ()

}

賦值運算子要注意以下四點:1.引數型別  2.返回值  3.檢測是否自己個自己賦值  4.返回*this

乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的值拷貝;編譯器預設生成的賦值運算子完成的是淺拷貝,有時不能滿足需求需要我們自己寫乙個賦值運算子的過載函式。

const修飾類的成員函式

將const修飾的類成員函式稱之為const成員函式,const修飾類成員函式,實際修飾該成員函式隱含的this指標,表明在該成員函式中不能對類的任何成員進行修改。

思考題

1)const物件可以呼叫非const成員函式嗎?

答:不能。const修飾的物件實則修飾的是該物件的this指標,並且const修飾的成員不能進行修改,如果使用const呼叫非const成員函式,可能會將const物件進行修改。

2)非const物件可以呼叫const成員函式嗎?

答:可以,這裡就是將乙個可以修改的物件進行讀取,是允許的。

3)const成員函式內可以呼叫其它的非const成員函式嗎?

答:不允許,const成員函式呼叫非const成員函式,呼叫該const成員函式的物件已經被設定為const型別,只可以訪問不能修改,在用該const成員函式訪問其他非const成員函式可能會修改,因此const成員函式不能呼叫非const成員函式。

4)非const成員函式內可以呼叫其它的const成員函式嗎?

答:允許,與非const物件呼叫const物件類似。

這兩個預設成員函式一般不用重新定義 ,編譯器缺省會生成。

class date

const date* operator&()const

private :

int _year ; // 年

int _month ; // 月

int _day ; // 日

};

這兩個運算子一般不需要過載,使用編譯器生成的預設取位址的過載即可,只有特殊情況,才需要過載,比如想讓別人獲取到指定的內容!

C 類和物件(中)

一 類的六個預設成員函式 1 初始化和清理。建構函式完成初始化,析構函式完成清理 2 拷貝複製 拷貝建構函式使用同類物件建立物件,賦值過載是把乙個物件賦值給另乙個物件 3 取位址和過載 主要是對普通物件和const物件取位址 二,建構函式 1 建構函式是乙個特殊成員函式,名字和類名相同,建立類型別物...

C 類和物件(中)

define crt secure no warnings 1 includeusing namespace std include if 0 建構函式是乙個特殊的成員函式,名字與類名相同,建立類型別物件時由編譯器自動呼叫,保證每個資料成員 都有 乙個合適的初始值,並且在物件的生命週期內只呼叫一次 ...

C 類和物件 類和物件

c 中物件的型別稱為類,類代表了某一批物件的共性和特徵,類是物件的抽象,而物件是類的具體例項,類是抽象的,不占用記憶體,而物件是具體的,占用 儲存空間,這點很重要,讀者需要牢記。類是使用者自己指定的型別,如果程式中要用到類型別,必須自己根據需要進行宣告,或者使用別人已設計好的類,c 標準本身並不提供...