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

C語(yǔ)言運(yùn)算符的重載詳解

 更新時(shí)間:2022年01月19日 09:20:49   作者:悲傷土豆拌飯  
大家好,本篇文章主要講的是C語(yǔ)言運(yùn)算符的重載詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下

寫(xiě)一個(gè)Add函數(shù)

我們先討論下面代碼,并復(fù)習(xí)前面的內(nèi)容

class Complex
{
private:
	double Real, Image;
public:
	Complex() :Real(0), Image(0) {}
	Complex(double r, double i) :Real(r), Image(i) {}
	~Complex() {}
	//Complex Add(const Complex* const this,const Complex &c)
	Complex Add(const Complex& x)const
	{
		Complex y;
		y.Real = Real + x.Real;
		y.Image = Image + x.Image;
		return y;
		//return Complex(this->Real + x.Real, this->Image + x.Image);
	}
	void Print()
	{
		cout << Real << "+" << Image << "i" << endl;
	}

};
int main()
{
	Complex c1(12, 23);
	Complex c2(4.5, 5.6);
	Complex c3;
	c3 = c1.Add(c2);
	c3.Print();

	return 0;
}

在這里插入圖片描述

直接return可以使用無(wú)名函數(shù)直接代替將亡值對(duì)象,相比可以省一次對(duì)象的構(gòu)建

我們?cè)俜治鋈绻覀兪褂?strong>引用返回Add函數(shù)

const Complex& Add(const Complex& x)const
	{
		Complex y;
		y.Real = Real + x.Real;
		y.Image = Image + x.Image;
		return y;
		//return Complex(this->Real + x.Real, this->Image + x.Image);
	}

在這里插入圖片描述

若我們以引用返回,將亡值對(duì)象會(huì)創(chuàng)建在Add函數(shù)的棧幀中,然后返回將亡值地址,函數(shù)return結(jié)束該空間會(huì)被釋放、

若沒(méi)有引用,構(gòu)建無(wú)名對(duì)象也就是將亡值對(duì)象會(huì)構(gòu)建在主函數(shù)的空間中,這里使用將亡值對(duì)象值給到c3是沒(méi)有問(wèn)題的

我們查看對(duì)象的構(gòu)造與析構(gòu)

class Complex
{
private:
	double Real, Image;
public:
	Complex() :Real(0), Image(0) {}
	Complex(double r, double i) :Real(r), Image(i) 
	{ 
		cout << "Create:" << this << endl; 
	}
	Complex(const Complex& x):Real(x.Real),Image(x.Image)
	{
		cout << "Copy Create:" << this << endl;
	}
	~Complex()
	{
		cout << "~Complex:" << this << endl;
	}
	//Complex Add(const Complex* const this,const Complex &c)
	Complex Add(const Complex& x)const
	{
		return Complex(this->Real + x.Real, this->Image + x.Image);
	}
	void Print()
	{
		cout << Real << "+" << Image << "i" << endl;
	}

};

int main()
{
	Complex c1(12, 23);
	Complex c2(4.5, 5.6);
	Complex c3;
	c3 = c1.Add(c2);
	c3.Print();

	return 0;
}

在這里插入圖片描述

首先我們使用引用返回需要加上const修飾,這是因?yàn)槲覀兎祷貙⑼鲋翟?strong>臨時(shí)空間具有常性,所以普通引用是不能進(jìn)行返回的,需要使用常引用返回

const Complex& Add(const Complex& x)const
{
	return Complex(this->Real + x.Real, this->Image + x.Image);
}

我們發(fā)現(xiàn)對(duì)臨時(shí)對(duì)象的構(gòu)建后馬上就進(jìn)行析構(gòu),那么是怎么將數(shù)據(jù)拿出給到c3的?這個(gè)在最后我們進(jìn)行分析

為什么不用加號(hào)作為函數(shù)名

//Complex operator+(const Complex* const this,const Complex &c)
Complex operator+(const Complex &c) const
{
	return Complex(this->Real + x.Real, this->Image + x.Image);
}

這里是不可以的,加號(hào)是一個(gè)操作符,不能使用操作放作為有效的函數(shù)名稱(chēng);但是在C++中為了使這些操作符號(hào)能夠當(dāng)作函數(shù)名,那么我們需要在前面加上一個(gè)關(guān)鍵字operator

//Complex operator+(const Complex* const this,const Complex &c)
Complex operator+(const Complex &c) const
{
	return Complex(this->Real + x.Real, this->Image + x.Image);
}
也就是告訴編譯器,加號(hào)是一個(gè)有效的函數(shù)名,這就叫做運(yùn)算符的重載;隨后我們之間使用 c3 = c1 + c2 就是可以的
int main()
{
	Complex c1(12, 23);
	Complex c2(4.5, 5.6);
	Complex c3;
	c3 = c1 + c2;
	//編譯器編譯會(huì)是下面的情況
	//c3 = c1.operator+(c2);
	//c3 = operator+(&c1,c2); 加上this指針
}

運(yùn)算符的重載

一個(gè)對(duì)象,編譯器會(huì)給它有6個(gè)缺省函數(shù)

在這里插入圖片描述

我們?cè)賮?lái)看下面這個(gè)問(wèn)題

//我們寫(xiě)一個(gè)賦值運(yùn)算符重載
void operator=(const Object& obj)
{
	this->value = obj.value;
}
//返回類(lèi)型為void,這樣不可以就不可以連等
//obja = objb = objc;
//obja = objb.operator=(objc);
//obja = operator=(&objb,objc); 返回的無(wú)類(lèi)型,不能給obja賦值

且賦值函數(shù)不可以定義為const修飾

Object& operator=(const Object& obj)
{
	this->value = obj.value;
	return *this;
}
obja = objb = objc;

//改寫(xiě)
obja = objb.operator=(objc);
obja = operator=(&objb,objc);

obja.operator=(operator=(&objb,objc));
operator=(&obja,operator=(&objb,objc));

通過(guò)返回對(duì)象,就可以實(shí)現(xiàn)連等;并且我們可以通過(guò)引用返回,因?yàn)?strong>此對(duì)象的生存期并不受函數(shù)的影響,不會(huì)產(chǎn)生一個(gè)臨時(shí)對(duì)象作為一個(gè)過(guò)度

防止自賦值
若是我們將obja給obja賦值,也就是自賦值

obja = obja
operator=(&obja,obja);

我們就需要進(jìn)行一步判斷

Object& operator=(const Object& obj)
{
	if(this != &obj)//防止自賦值
	{
		this->value = obj.value;
	}
	return *this;
}

上面問(wèn)題解決

我們通過(guò)這段代碼來(lái)看,與上面問(wèn)題相同

	Object& operator=(const Object& obj)
	{
		if (this != &obj)
		{
			this->value = obj.value;
		}
		return *this;
	}

};
Object& fun(const Object& obj)
{
	int val = obj.Value() + 10;
	Object obja(val);
	return obja;
}

int main()
{
	Object objx(0);
	Object objy(0);
	objy = fun(objx);
	cout << objy.Value() << endl;
	return 0;
}

我們?cè)谶@里希望通過(guò)引用返回,這里return的臨時(shí)對(duì)象會(huì)構(gòu)建在fun函數(shù)的棧幀中,并且在函數(shù)結(jié)束棧幀釋放,隨后調(diào)用賦值運(yùn)算符重載,但是數(shù)值依舊是正確的

在這里插入圖片描述

我們跟蹤這個(gè)被析構(gòu)對(duì)象的地址,首先我們定位在fun函數(shù)的return obja;,隨后進(jìn)入析構(gòu)函數(shù)將我們的obja進(jìn)行析構(gòu)

在這里插入圖片描述

接著運(yùn)行到回到主函數(shù)進(jìn)行賦值,接著進(jìn)入賦值運(yùn)算符重載,可以看到,這里的obj地址與已被析構(gòu)的obja地址相同

在這里插入圖片描述

在這里插入圖片描述

可以看到這個(gè)值依舊存在,依舊可以打印給出,這是因?yàn)関s2019的特殊性質(zhì)造成的;我們每次運(yùn)行程序會(huì)發(fā)現(xiàn)每次的對(duì)象地址都在變化,邏輯地址會(huì)隨機(jī)改變,被析構(gòu)對(duì)象的棧幀不會(huì)被接下來(lái)的賦值運(yùn)算符重載擾亂地址空間,所以即使我們引用返回的對(duì)象已經(jīng)死亡依舊可以將數(shù)值正確返回

但是在vc中,我們得到的值會(huì)是隨機(jī)值,這是因?yàn)関c中每次運(yùn)行程序地址都不會(huì)改變,當(dāng)我們從fun函數(shù)退出進(jìn)入賦值語(yǔ)句中,就會(huì)將原本存儲(chǔ)數(shù)據(jù)的地址擾亂,繼而變成了隨機(jī)值

盡管我們引用返回能夠?qū)?shù)據(jù)正確打印,但是該對(duì)象已經(jīng)死亡,這是不安全的,所以我們一定不要以引用返回對(duì)象

在這里插入圖片描述

VS2019具有一個(gè)特點(diǎn):當(dāng)我們調(diào)用函數(shù),若函數(shù)中沒(méi)有定義局部變量或局部對(duì)象時(shí),該函數(shù)基本不對(duì)棧幀進(jìn)行清掃

總結(jié)

到此這篇關(guān)于C語(yǔ)言運(yùn)算符的重載詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言運(yùn)算符重載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)

    Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)

    用于數(shù)據(jù)傳輸?shù)牡蛯泳W(wǎng)絡(luò)協(xié)議,多個(gè)物聯(lián)網(wǎng)協(xié)議都是基于TCP協(xié)議的,這篇文章為大家介紹了Qt?TCP網(wǎng)絡(luò)通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 淺談C++虛重載操作符 virtual operator= 的使用方法

    淺談C++虛重載操作符 virtual operator= 的使用方法

    下面小編就為大家?guī)?lái)一篇淺談C++虛重載操作符 virtual operator= 的使用方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • C++vector的insert函數(shù)用法小結(jié)

    C++vector的insert函數(shù)用法小結(jié)

    std::vector::insert是C++中用于在指定位置插入元素的函數(shù),支持插入單個(gè)元素、多個(gè)相同元素、一個(gè)范圍的元素或初始化列表中的元素,插入操作可能會(huì)使插入點(diǎn)之后的迭代器失效,并且時(shí)間復(fù)雜度為O(n),本文介紹C++vector的insert函數(shù)用法小結(jié),感興趣的朋友一起看看吧
    2025-03-03
  • Windows安裝Qt6.4.2及簡(jiǎn)單驗(yàn)證

    Windows安裝Qt6.4.2及簡(jiǎn)單驗(yàn)證

    本文主要介紹了Windows安裝Qt6.4.2及簡(jiǎn)單驗(yàn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C語(yǔ)言樹(shù)狀數(shù)組的實(shí)例詳解

    C語(yǔ)言樹(shù)狀數(shù)組的實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言樹(shù)狀數(shù)組的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • 舉例理解C語(yǔ)言二維數(shù)組的指針指向問(wèn)題

    舉例理解C語(yǔ)言二維數(shù)組的指針指向問(wèn)題

    這篇文章主要介紹了C語(yǔ)言二維數(shù)組的指針指向問(wèn)題,文中不建議用二級(jí)指針來(lái)訪(fǎng)問(wèn)二維數(shù)組,需要的朋友可以參考下
    2015-12-12
  • CreateThread()與beginthread()的區(qū)別詳細(xì)解析

    CreateThread()與beginthread()的區(qū)別詳細(xì)解析

    很多開(kāi)發(fā)者不清楚這兩者之間的關(guān)系,他們隨意選一個(gè)函數(shù)來(lái)用,發(fā)現(xiàn)也沒(méi)有什么大問(wèn)題,于是就忙于解決更為緊迫的任務(wù)去了。等到有一天忽然發(fā)現(xiàn)一個(gè)程序運(yùn)行時(shí)間很長(zhǎng)的時(shí)候會(huì)有細(xì)微的內(nèi)存泄露,開(kāi)發(fā)者絕對(duì)不會(huì)想到是因?yàn)檫@兩套函數(shù)用混的結(jié)果
    2013-09-09
  • C語(yǔ)言結(jié)構(gòu)體的一些理解

    C語(yǔ)言結(jié)構(gòu)體的一些理解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言結(jié)構(gòu)體的一些理解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 深入c++中臨時(shí)對(duì)象的析構(gòu)時(shí)機(jī)的詳解

    深入c++中臨時(shí)對(duì)象的析構(gòu)時(shí)機(jī)的詳解

    本篇文章對(duì)c++中臨時(shí)對(duì)象的析構(gòu)時(shí)機(jī)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c++ vector 使用find查找指定元素方法

    c++ vector 使用find查找指定元素方法

    std::vector?是一個(gè)動(dòng)態(tài)數(shù)組,用于存儲(chǔ)同類(lèi)型元素的序列,本文主要介紹了c++ vector 使用find查找指定元素方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03

最新評(píng)論

防城港市| 永宁县| 时尚| 吉木乃县| 临洮县| 偏关县| 来安县| 舞钢市| 新干县| 甘德县| 天柱县| 龙山县| 长垣县| 苏尼特右旗| 巴南区| 鱼台县| 亚东县| 平定县| 大邑县| 利川市| 琼中| 临朐县| 务川| 太和县| 崇信县| 长治县| 寿光市| 平凉市| 丰镇市| 信阳市| 疏附县| 光泽县| 浦县| 开平市| 张家界市| 宾川县| 和硕县| 高雄市| 若羌县| 嘉黎县| 平原县|