溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++類的默認(rèn)成員函數(shù)有哪些

發(fā)布時(shí)間:2022-02-18 09:12:35 來源:億速云 閱讀:180 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“C++類的默認(rèn)成員函數(shù)有哪些”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C++類的默認(rèn)成員函數(shù)有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

    類的默認(rèn)成員函數(shù)

    每個(gè)類中,如果不主動(dòng)實(shí)現(xiàn)默寫特定函數(shù),類中也會(huì)自動(dòng)去生成這些函數(shù),它們就是默認(rèn)成員函數(shù)。默認(rèn)成員函數(shù)分為六種,它們是特殊的成員函數(shù),如果我們不實(shí)現(xiàn),編譯器會(huì)自己實(shí)現(xiàn)。

    C++類的默認(rèn)成員函數(shù)有哪些

    下面將對(duì)這些函數(shù)一 一進(jìn)行介紹。

    構(gòu)造函數(shù)

    概念

    構(gòu)造函數(shù)的作用即為初始化,相當(dāng)于平時(shí)我們自己寫的Init函數(shù),但在對(duì)象實(shí)例化時(shí)會(huì)自動(dòng)調(diào)用,以保證實(shí)例化對(duì)象一定初始化。

    特性

    (1)函數(shù)名與類名相同

    如日期類Date,其構(gòu)造函數(shù)名也為Date

    (2)無返回值

    以日期類為例,其構(gòu)造函數(shù)的聲明和定義可以寫成如下樣子:

    class Date{public:Date(int year = 0, int month = 1, int day = 1);private:int _year;int _month;int _day;};class Date
    {
    public:
    	Date(int year = 0, int month = 1, int day = 1);
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    Date::Date(int year, int month, int day)
    {
    	_year = year;
    	_month = month;
    	_day = day;
    }

    (3)對(duì)象實(shí)例化時(shí)編譯器自動(dòng)調(diào)用對(duì)應(yīng)的構(gòu)造函數(shù)

    為了驗(yàn)證這一點(diǎn),我們創(chuàng)建一個(gè)對(duì)象,但不對(duì)其進(jìn)行其它操作:

    int main()
    {  
    	Date date1;
    	return 0;
    }

    C++類的默認(rèn)成員函數(shù)有哪些

    C++類的默認(rèn)成員函數(shù)有哪些

     通過調(diào)試可以發(fā)現(xiàn)對(duì)象date1已經(jīng)被自動(dòng)初始化了。

    (4)構(gòu)造函數(shù)可以重載

    (5)如果類中沒有顯式定義構(gòu)造函數(shù),則C++編譯器會(huì)自動(dòng)生成一個(gè)無參的默認(rèn)構(gòu)造函數(shù),一旦用戶顯式定義,編譯器將不再自動(dòng)生成。

    (6)無參的構(gòu)造函數(shù)和全缺省的構(gòu)造函數(shù)都稱為默認(rèn)構(gòu)造函數(shù),并且默認(rèn)構(gòu)造函數(shù)只能有一個(gè)。

    針對(duì)第五點(diǎn),我們不免會(huì)發(fā)出疑問,編譯器自動(dòng)生成的默認(rèn)構(gòu)造函數(shù)究竟干了什么呢?

    首先,需要先了解C++把類型分為兩類:內(nèi)置類型(基本類型)和自定義類型。

    內(nèi)置類型就是C語言自帶的類型,如int、char、double、指針、內(nèi)置類型的數(shù)組;而自定義類型就是strucrt和class定義的類型。

    編譯器默認(rèn)生成的構(gòu)造函數(shù),對(duì)于成員變量中的內(nèi)置類型不做初始化,對(duì)于自定義類型成員變量則會(huì)調(diào)用它的默認(rèn)構(gòu)造函數(shù)初始化,如果沒有默認(rèn)構(gòu)造函數(shù)則會(huì)報(bào)錯(cuò)。

    析構(gòu)函數(shù)

    概念

    析構(gòu)函數(shù)的功能是完成對(duì)象中資源的清理。虛構(gòu)函數(shù)會(huì)在對(duì)象的生命周期到了之后調(diào)用。

    特性

    (1)析構(gòu)函數(shù)名是在類名前加上字符~。

    (2)無參數(shù)無返回值。

    日期類析構(gòu)函數(shù)的聲明可以寫成如下形式:

    ~Date();

    (3)一個(gè)類有且只有一個(gè)析構(gòu)函數(shù)。若喂顯式定義,系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的析構(gòu)函數(shù)。

    (4)對(duì)象生命周期結(jié)束時(shí),C++編譯系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)。 

    對(duì)于編譯器自動(dòng)生成的默認(rèn)析構(gòu)函數(shù),與構(gòu)造函數(shù)類似,對(duì)于內(nèi)置類型成員變量不做處理;對(duì)于自定義類型成員變量會(huì)去調(diào)用它的構(gòu)造函數(shù)。

    拷貝構(gòu)造函數(shù)

    概念

    拷貝構(gòu)造函數(shù)用于使用同類型對(duì)象去初始化實(shí)例對(duì)象。

    特征

    (1)拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的一個(gè)重載形式。

    (2)拷貝構(gòu)造函數(shù)的參數(shù)只有一個(gè)且必須使用引用傳參,使用傳值的方式會(huì)引發(fā)無窮遞歸調(diào)用。

    日期類拷貝構(gòu)造函數(shù)的聲明需要寫成如下形式:

    Date(Date& date);

    為什么必須采用引用傳參呢?引發(fā)無窮遞歸又是怎么一回事呢?

    不妨來思考一下,傳參實(shí)際上也是對(duì)內(nèi)容進(jìn)行臨時(shí)拷貝,將實(shí)參傳給形參本身就需要調(diào)用拷貝構(gòu)造。由此一來,會(huì)導(dǎo)致不斷調(diào)用拷貝構(gòu)造,造成無窮遞歸調(diào)用。

    (3)若未顯式定義,系統(tǒng)會(huì)生成默認(rèn)的拷貝構(gòu)造函數(shù)了。

    默認(rèn)拷貝構(gòu)造函數(shù)對(duì)于內(nèi)置類型成員,會(huì)完成按字節(jié)序的拷貝(淺拷貝),如果需要深拷貝則需要自己寫拷貝構(gòu)造函數(shù);對(duì)于自定義類型成員,則會(huì)調(diào)用它的拷貝構(gòu)造函數(shù)。

    所謂按字節(jié)序拷貝指將內(nèi)存中的內(nèi)容照搬照抄,復(fù)制過來。在一些情況下就會(huì)出錯(cuò),如存放申請(qǐng)內(nèi)存地址的指針,如果按字節(jié)序拷貝,會(huì)導(dǎo)致兩個(gè)對(duì)象中的成員變量指向同一塊空間,在析構(gòu)時(shí)會(huì)導(dǎo)致同一塊空間釋放內(nèi)存多次,引發(fā)錯(cuò)誤。

    賦值運(yùn)算符重載

    運(yùn)算符重載

    在談及賦值運(yùn)算符重載前,必須先來講一講運(yùn)算符重載。

    我們知道,對(duì)于int類型,是可以進(jìn)行加減乘除等運(yùn)算的。但對(duì)于自定義類型,能否實(shí)現(xiàn)加減乘除運(yùn)算呢?這就需要運(yùn)用到運(yùn)算符重載了。

    運(yùn)算符重載是具有特殊函數(shù)名的函數(shù)。函數(shù)名字為:operator操作符(參數(shù)列表)

    注意:一些運(yùn)算符不支持重載,即:.*、::、sizeof、?:、.

    以Date類==運(yùn)算符重載為例,需要將函數(shù)作為成員函數(shù),以便于訪問成員變量:

    class Date
    {
    public:
    	Date(int year = 0, int month = 1, int day = 1);
    	bool operator==(Date& date)const;
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    bool Date::operator==(Date& date)const
    {
    	return _year == date._year
    		&& _month == date._month
    		&& _day == date._day;
    }

    賦值運(yùn)算符重載

    賦值運(yùn)算符重載顧名思義,是對(duì)賦值運(yùn)算符進(jìn)行的重載,用于兩個(gè)已經(jīng)存在的對(duì)象進(jìn)行賦值拷貝。

    賦值運(yùn)算符重載有四個(gè)要點(diǎn):

    (1)參數(shù)類型

    (2)返回值

    (3)檢測是否自己給自己賦值

    (4)返回*this,用于連續(xù)賦值

    一個(gè)類如果沒有顯式定義賦值運(yùn)算符重載,編譯器會(huì)自己生成一個(gè),對(duì)于內(nèi)置成員,完成按字節(jié)序拷貝;對(duì)于自定義成員變量,會(huì)調(diào)用它的賦值運(yùn)算符重載。

    取地址及const取地址操作符重載

    這兩個(gè)運(yùn)算符一般不需要重新定義,使用編譯器生成的重載即可,只有特殊情況才需要重載,如不希望自己特定的內(nèi)容被別人訪問時(shí)。

    讀到這里,這篇“C++類的默認(rèn)成員函數(shù)有哪些”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    c++
    AI