最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++類中六個默認的成員函數(shù)詳解

 更新時間:2021年04月08日 11:35:03   作者:_Camille  
這篇文章主要給大家介紹了關(guān)于C++類中六個默認的成員函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

淺談

先來說一下“this指針”:

C++中通過引入this指針解決該問題,暨:C++編譯器給每個“非靜態(tài)的成員函數(shù)”增加了一個隱藏的指針參數(shù),讓該指針指向當(dāng)前對象(函數(shù)運行時調(diào)用該函數(shù)的對象),在函數(shù)體中所有成員變量的操作,都是通過該指針去訪問,只不過所有的操作對用戶是透明的,暨用戶不需要來傳遞,編譯器自動完成。

說了這么多其實編譯器在生成程序時獲取對象首地址的信息。然后將獲取的對象的首地址存放在了寄存器中,成員函數(shù)的其它參數(shù)都是存放在棧中。而this指針參數(shù)則是存放在寄存器中。類的靜態(tài)成員函數(shù)(用static修飾的成員函數(shù))因為沒有this指針這個參數(shù),所以類的靜態(tài)成員函數(shù)也就無法調(diào)用類的非靜態(tài)成員變量。

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

構(gòu)造函數(shù)是一個特殊的成員函數(shù),名字與類名相同且不能有返回值,創(chuàng)建類類型時由編譯器自動調(diào)用,在對象的生命周期內(nèi)只調(diào)用一次。**主要任務(wù)是初始化對象。

↓下面是一個簡單的構(gòu)造函數(shù)(全缺?。?/p>

主函數(shù)初始化時如果無參則以缺省值0給成員變量賦值。

默認構(gòu)造函數(shù):

Q:為什么會出現(xiàn)上面的報錯——包含多個默認構(gòu)造函數(shù)?

A:無參的構(gòu)造函數(shù)和全缺省的構(gòu)造函數(shù)都稱為默認構(gòu)造函數(shù),并且默認構(gòu)造函數(shù)只能有一個。注意:無參構(gòu)造函數(shù),全缺省構(gòu)造函數(shù),我們沒寫編譯器默認生成的構(gòu)造函數(shù),都可以稱為默認構(gòu)造函數(shù)。

特征:

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

2.無返回值;

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

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

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

析構(gòu)函數(shù):與構(gòu)造函數(shù)功能相反,析構(gòu)函數(shù)是完成對象的銷毀,局部對象銷毀工作是由編譯器完成的。而對象在銷毀時會自動調(diào)用析構(gòu)函數(shù),完成類的一些資源清理工作,和構(gòu)造函數(shù)一樣,如果我們沒寫析構(gòu)函數(shù),系統(tǒng)會生成一個默認析構(gòu)函數(shù),但這個析構(gòu)函數(shù)什么都不會做。

如果類中的成員變量不需要動態(tài)開辟內(nèi)存空間,則默認析構(gòu)函數(shù)可以完成析構(gòu)任務(wù),比如下面這種,可以說不用析構(gòu)。

但是像下面這種,默認析構(gòu)函數(shù)已經(jīng)不能夠完成


特征:

1.函數(shù)名是在類名前加上字符~;

2.無參數(shù)(有一個隱藏參數(shù)*this指針)無返回值;

3.一個類有且僅有一個析構(gòu)函數(shù),若未顯示定義,系統(tǒng)會自動生成默認的析構(gòu)函數(shù);

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

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

拷貝構(gòu)造函數(shù):只有單個形參,該形參是對本類類型對象的引用(一般常用const修飾),在用已存在的類類型對象創(chuàng)建新對象時由編譯器自動調(diào)用。

從上圖我們可以看出,關(guān)于給t2變量初始化時肯定不是調(diào)用構(gòu)造函數(shù)。

下面這張圖應(yīng)該就可以解釋上面的問題

關(guān)于對拷貝構(gòu)造函數(shù)參數(shù)的說明:

當(dāng)然也同構(gòu)造函數(shù)一樣,若未顯示定義,系統(tǒng)生成默認的拷貝構(gòu)造函數(shù)。默認的拷貝構(gòu)造函數(shù)對象按內(nèi)存存儲按字節(jié)序完成拷貝,暨淺拷貝或值拷貝

特征:

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

2.拷貝構(gòu)造函數(shù)的參數(shù)只有一個(當(dāng)然還有個隱藏的*this)且必須使用引用傳參,使用傳值方式會引發(fā)死遞歸。

賦值重載函數(shù)

賦值重載函數(shù):C++為了增強代碼的可讀性引入了運算符重載,運算符重載是具有特殊函數(shù)名的函數(shù),也具有其返回值類型,函數(shù)名字以及參數(shù)列表,其返回值類型與普通的函數(shù)類似。

**函數(shù)名字為:**關(guān)鍵字operator后面接需要重載的運算符符號;

函數(shù)原型:返回值類型operator操作符(參數(shù)列表)

Test& operator= (const Test& t)

注意:

不能通過連接其他符號來創(chuàng)建新的操作符:比如operator@;

重載操作符必須有一個類類型或者枚舉類型的操作數(shù);

用于內(nèi)置類型的操作符的操作符,其含義不能改變,例如:內(nèi)置的整型+,不能改變其含義;

作為類成員的重載函數(shù)時,其形參看起來比操作數(shù)數(shù)目少1成員函數(shù)的,操作符有一個默認的形參this,限定為第一個形參;

*、::、sizeof、?:、. 以上5個運算符不能重載。

一個類如果沒有顯示定義賦值運算符重載,編譯器也會生成一個,完成對象按字節(jié)序的值拷貝。

const成員函數(shù)

將const修飾的類成員函數(shù)稱之為const成員函數(shù),const修飾類成員函數(shù),實際修飾該成員函數(shù)隱含的this指針,表明該成員函數(shù)中不能對類的任何成員進行修改。

multable關(guān)鍵字:當(dāng)有必須要修改的成員變量時,需在成員變量聲明時前加上該關(guān)鍵字,及時是const成員函數(shù)也依然可以修改。

取地址及const取地址重載函數(shù)

這兩個默認成員函數(shù)一般不用重新定義,編譯器默認生成;

class Date
{
public:
	Date* operator&()
	{
		return this;
	}
	//因為對象被const修飾不能更改,所以返回值也要被const修飾
	const Date* operator&() const
	{
		return this;
	}
private:
	int _year;
	int _month;
	int _day;
};

深挖

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

上面的代碼居然可以正常運行并且賦值成功,這是為什么。實際上編譯器在執(zhí)行賦值語句前,將“100作為參數(shù)來構(gòu)造一個無名的臨時的類”然后進行賦值。

上面這種情況我們稱為**“隱式轉(zhuǎn)換”**。

explicit關(guān)鍵字:如果在構(gòu)造函數(shù)前加上這個關(guān)鍵字,則要求顯示轉(zhuǎn)換,不能進行隱式轉(zhuǎn)換。

因此我們進行強轉(zhuǎn)之后再賦值;

我們換一種思路,將“類”給整型賦值,且先給出一個強轉(zhuǎn)函數(shù);

最后介紹另外一種初始化的方式:

給出一個復(fù)數(shù)類,參數(shù)列表初始化的效率要高于第一種初始化方式。

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

下面介紹一下深拷貝,先看下面一段代碼:

這個代碼中我們沒有寫拷貝構(gòu)造函數(shù),可見默認拷貝函數(shù)這里出了問題;前面我們說過,默認拷貝方式是淺拷貝,也就是值拷貝。

上面s1使用hello初始化,s2使用s1的值來拷貝,因此s2并未開辟新空間,而是指向s1的空間,因此在最后調(diào)用析構(gòu)函數(shù)的時候,對同一塊空間free了兩次。

如果將代碼改成下面這種,那么就不會報錯。

賦值運算符重載函數(shù)

這里我們繼續(xù)引用上面構(gòu)造函數(shù)部分最后給出的那個復(fù)數(shù)類

我們上面說了賦值重載函數(shù),那么到底什么是賦值運算符重載呢?

運算符重載:對運算符賦予新的意義↓↓↓

由上圖可知,上面這個對加法運算符符號“+”的重載函數(shù)是成員函數(shù),因為它參數(shù)里面有一個隱藏的的this指針,所以需要用對象來調(diào)動它。

上面的代碼整體的思路就是:

1.調(diào)用四次次構(gòu)造函數(shù),構(gòu)造C1C2C3以及在operator+內(nèi)部的tmp;

2.C1調(diào)用加法重載函數(shù)進行C1+C2;

3.加法重載函數(shù)返回時需要調(diào)動一次拷貝構(gòu)造函數(shù)(tmp拷貝到臨時對象);

4.調(diào)用賦值重載將C1+C2的值賦給C。

當(dāng)寫的類想做某種運算時,但編譯器不支持,因此我們需要對運算符進行重載。

總結(jié)

到此這篇關(guān)于C++類中六個默認的成員函數(shù)詳解的文章就介紹到這了,更多相關(guān)C++類成員函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • linux c++ 服務(wù)器端開發(fā)面試必看書籍整理

    linux c++ 服務(wù)器端開發(fā)面試必看書籍整理

    這篇文章主要介紹了linux c++ 服務(wù)器端開發(fā)面試必看書籍整理,需要的朋友可以參考下
    2020-02-02
  • C語言中二級指針解析(指向指針的指針)

    C語言中二級指針解析(指向指針的指針)

    這篇文章主要介紹了C語言中二級指針(指向指針的指針),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • CLion安裝、漢化、配置圖文詳解

    CLion安裝、漢化、配置圖文詳解

    這篇文章主要介紹了CLion安裝、漢化、激活、配置圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • include包含頭文件的語句中,雙引號和尖括號的區(qū)別(詳解)

    include包含頭文件的語句中,雙引號和尖括號的區(qū)別(詳解)

    下面小編就為大家?guī)硪黄猧nclude包含頭文件的語句中,雙引號和尖括號的區(qū)別(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • C/C++中輸入多組數(shù)據(jù)的方法

    C/C++中輸入多組數(shù)據(jù)的方法

    這篇文章主要為大家詳細介紹了C/C++中輸入多組數(shù)據(jù)的三種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 解析C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體

    解析C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體

    這篇文章主要介紹了C/C++指針、函數(shù)、結(jié)構(gòu)體、共用體的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • C語言超詳細講解函數(shù)指針的運用

    C語言超詳細講解函數(shù)指針的運用

    函數(shù)指針是一個指針變量,它可以存儲函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關(guān)于C語言進階教程之函數(shù)指針的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • C語言實現(xiàn)簡易學(xué)生成績管理系統(tǒng)

    C語言實現(xiàn)簡易學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡易學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語言修煉之路悟徹數(shù)組真妙理?巧用下標破萬敵上篇

    C語言修煉之路悟徹數(shù)組真妙理?巧用下標破萬敵上篇

    在C語言和C++等語言中,數(shù)組元素全為指針變量的數(shù)組稱為指針數(shù)組,指針數(shù)組中的元素都必須具有相同的存儲類型、指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便、靈活
    2022-02-02
  • PyQt5實現(xiàn)滑動開關(guān)的示例詳解

    PyQt5實現(xiàn)滑動開關(guān)的示例詳解

    這篇文章主要為大家詳細介紹了如何使用PyQt5實現(xiàn)滑動開關(guān)的效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12

最新評論

扶绥县| 平乡县| 丰原市| 凯里市| 财经| 门头沟区| 沙田区| 新宾| 沙田区| 民县| 乐昌市| 沛县| 阿拉善左旗| 安泽县| 德令哈市| 石城县| 昭觉县| 克拉玛依市| 凤翔县| 临江市| 宝应县| 永安市| 龙泉市| 分宜县| 长泰县| 镇沅| 公主岭市| 高州市| 康马县| 噶尔县| 新野县| 天长市| 剑河县| 高安市| 中卫市| 长汀县| 布拖县| 肃宁县| 凤翔县| 乡宁县| 星子县|