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

一起聊聊C++中的特殊成員函數(shù)

 更新時(shí)間:2022年07月12日 10:38:25   作者:一線碼農(nóng)  
在C#中要說類默認(rèn)給我們定義的特殊成員函數(shù),莫過于構(gòu)造函數(shù),但在?C++?中這樣的特殊函數(shù)高達(dá)6種,本文就整合一下和大家一起聊一聊

一:背景

在C#中要說類默認(rèn)給我們定義的特殊成員函數(shù),莫過于構(gòu)造函數(shù),但在 C++ 中這樣的特殊函數(shù)高達(dá) 6 種,有必要整合一下聊一聊。

二:特殊成員函數(shù)

1. 默認(rèn)構(gòu)造函數(shù)

和 C# 一樣,很多書中都說,如果用戶沒有定義 構(gòu)造函數(shù),那么編譯器會(huì)給我們定義一個(gè),參考下面的例子:

class Person {

public:
	string name;
	int age;
};

int main()
{
	Person person;
}

接下來觀察下匯編代碼,看下有沒有調(diào)用 默認(rèn)構(gòu)造函數(shù) .

    Person person;
003E32EF  lea         ecx,[person]  
003E32F2  call        Person::Person (03E15EBh)

對(duì)于 C# 學(xué)習(xí)者來說有點(diǎn)懵哈,定義了就相當(dāng)于new了, 哈哈,這是因?yàn)镃++默認(rèn)都是值類型哈,不過這里有必要澄清一下,并不一定所有情況都會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù),因?yàn)镃++的匯編生成由各自 編譯器 來決定,如果 編譯器 覺得沒必要調(diào)用構(gòu)造函數(shù) 那它就會(huì)把這一步省掉來加速性能,那什么時(shí)候不會(huì)調(diào)呢? 參考如下代碼。

class Person {

public:
	void show() {
		printf("show!");
	}
};

int main()
{
	Person person;
	person.show();
}

接下來看下匯編代碼。

    person.show();
00E73F4F  lea         ecx,[person]  
00E73F52  call        Person::show (0E713B6h) 

可以清楚的看到,這種情況下調(diào)用構(gòu)造函數(shù)其實(shí)沒有必要,所以編譯器就干脆省略了。

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

在C#中析構(gòu)函數(shù) 是由CLR負(fù)責(zé)管理,在C++中沒有托管這個(gè)概念,所以默認(rèn)只能是結(jié)束作用域之前,自動(dòng)調(diào)用析構(gòu)函數(shù)釋放,參考如下圖:

3. 賦值構(gòu)造函數(shù)

剛才也說到了,在 C++ 中甭管是 class 還是 struct 默認(rèn)都是值類型,既然是值類型就存在stack copy 的情況,在 C# 中也是因?yàn)橹貙懥?nbsp;Equals 和 GetHashCode 來實(shí)現(xiàn)的值copy,接下來簡單看下代碼:

class Person {

public:
	string name;
	int age;
};

int main()
{
	Person p1 = { "jack",20 };
	Person p2(p1);
}

再看下 Person p2(p1) 的匯編代碼。

    Person p2(p1);
000F80A2  lea         eax,[p1]  
000F80A5  push        eax  
000F80A6  lea         ecx,[p2]  
000F80A9  call        Person::Person (0F15C3h) 

從匯編中可以看到調(diào)用了 Person::Person (0F15C3h) 函數(shù),請(qǐng)注意,這個(gè)不是構(gòu)造函數(shù),而是 賦值構(gòu)造函數(shù), 可以調(diào)試下去看看哦。。。 截圖如下:

值得說一下的是,C++ 默認(rèn)提供的賦值構(gòu)造函數(shù)是淺copy,如果要實(shí)現(xiàn)深 copy 的話,或者有一些自定義的邏輯,建議自己實(shí)現(xiàn)一下。

class Person {

public:
	string name;
	int age;

public:
	Person(string name, int age) :name(name), age(age) {}
	Person(const Person& p) {
		name = p.name;
		age = p.age;
	}
};

int main()
{
	Person p1 = { "aaaaaaaaaaaaaaaaaaaaaaaaaaa",20 };
	Person p2(p1);
}

4. 賦值運(yùn)算符

在 C# 中值類型, 匿名類型, Record 都是重寫過 Equals 及 = 運(yùn)算符,所以可以在這些類型上用 =, 其實(shí)在 C++ 中也可以在 class 之間進(jìn)行賦值,因?yàn)榫幾g器會(huì)幫我們重寫運(yùn)算符 = ,如何看出來呢?先看下代碼:

class Person {

public:
	string name;
	int age;

public:
	Person(string name, int age) :name(name), age(age) {}
	Person(const Person& p) {
		name = p.name;
		age = p.age;
	}
};

int main()
{
	Person p1 = { "aaaaaaaaaaaaaaaaaaaaaaaaaaa",20 };
	Person p2 = { "bbbbbbbbbbbbbbbbbbbbbbbbbbb",22 };

	p2 = p1;
}

最后一句的 p2 = p1 之所以能成功是因?yàn)?nbsp;= 被重寫了,參考匯編代碼。

    p2 = p1;
00FD967C  lea         eax,[p1]  
00FD967F  push        eax  
00FD9680  lea         ecx,[p2]  
00FD9683  call        Person::operator= (0FD161Dh) 

如果需要自定義,可以自己重寫。

class Person {

public:
	string name;
	int age;

public:
	Person(string name, int age) :name(name), age(age) {}
	Person(const Person& p) {
		name = p.name;
		age = p.age;
	}
	Person& operator = (const Person& p) {
		name = p.name;
		age = p.age;
		return *this;
	}
};

int main()
{
	Person p1 = { "aaaaaaaaaaaaaaaaaaaaaaaaaaa",20 };
	Person p2 = { "bbbbbbbbbbbbbbbbbbbbbbbbbbb",22 };

	p2 = p1;
}

到此這篇關(guān)于一起聊聊C++中的特殊成員函數(shù)的文章就介紹到這了,更多相關(guān)C++ 特殊成員函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言strtod()函數(shù)案例詳解

    C語言strtod()函數(shù)案例詳解

    這篇文章主要介紹了C語言strtod()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言實(shí)現(xiàn)BMP圖像細(xì)化處理

    C語言實(shí)現(xiàn)BMP圖像細(xì)化處理

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)BMP圖像細(xì)化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • C++棧(stack)的模板類實(shí)現(xiàn)代碼

    C++棧(stack)的模板類實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了C++棧(stack)的模板類實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 異步http listener 完全并發(fā)處理懲罰http懇求的小例子

    異步http listener 完全并發(fā)處理懲罰http懇求的小例子

    異步http listener 完全并發(fā)處理懲罰http懇求的小例子,需要的朋友可以參考一下
    2013-05-05
  • 詳解C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問題

    詳解C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問題

    這篇文章主要為大家詳細(xì)介紹了C++類的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 使用C語言實(shí)現(xiàn)從avi視頻中提取圖片

    使用C語言實(shí)現(xiàn)從avi視頻中提取圖片

    這篇文章主要為大家詳細(xì)介紹了如何使用C語言實(shí)現(xiàn)從avi視頻中提取圖片,文中的示例代碼簡潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2023-10-10
  • C++回溯算法之深度優(yōu)先搜索詳細(xì)介紹

    C++回溯算法之深度優(yōu)先搜索詳細(xì)介紹

    回溯在迷宮搜索中使用很常見,就是這條路走不通,然后返回前一個(gè)路口,繼續(xù)下一條路。回溯算法說白了就是窮舉法,下面讓我們一起來看看回溯算法中深度優(yōu)先搜索吧
    2023-01-01
  • C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式

    C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式

    這篇文章主要介紹了C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++:string字符串的切片方式

    C++:string字符串的切片方式

    這篇文章主要介紹了C++:string字符串的切片方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • C語言中那些你必須知道的常用關(guān)鍵字

    C語言中那些你必須知道的常用關(guān)鍵字

    這篇文章主要介紹了C語言中我們常用的關(guān)鍵字靜態(tài)static的詳細(xì)講解和typedef?、#define定義常量和宏,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06

最新評(píng)論

闸北区| 砀山县| 板桥市| 朝阳市| 黄冈市| 平昌县| 衡东县| 长汀县| 大安市| 北安市| 固安县| 两当县| 同德县| 大英县| 康保县| 中江县| 峨山| 喀什市| 衡阳县| 香港| 通山县| 通化市| 林州市| 永和县| 泸水县| 无锡市| 成都市| 深泽县| 平昌县| 黄平县| 宜兰市| 湾仔区| 将乐县| 湘乡市| 遂平县| 靖边县| 随州市| 丹棱县| 怀化市| 崇礼县| 琼中|