" />

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

C++重載運(yùn)算符你真的了解嗎

 更新時(shí)間:2022年03月27日 11:49:40   作者:_Phoebe__  
這篇文章主要為大家詳細(xì)介紹了C++重載運(yùn)算符,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

運(yùn)算符實(shí)際上是一個(gè)函數(shù),所以運(yùn)算符的重載實(shí)際上是函數(shù)的重載,。編譯程序?qū)\(yùn)算符的重載的選擇,遵循函數(shù)重載的選擇原則。當(dāng)遇到不很明顯的運(yùn)算時(shí),編譯程序會(huì)尋找與參數(shù)相匹配的運(yùn)算符函數(shù)。

1.重載運(yùn)算符的必要性

C++語(yǔ)言中的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和構(gòu)造數(shù)據(jù)類型。基本數(shù)據(jù)類型可以直接完成算術(shù)運(yùn)算。例如:

#include<bits/stdc++.h>
using namespace std;
int main(void){
	int a=10;
	int b=20;
	cout<<a+b<<endl;
} 

程序中實(shí)現(xiàn)了兩個(gè)整型變量的相加,可以正確輸出運(yùn)行結(jié)果30。通過兩個(gè)浮點(diǎn)變量、兩個(gè)雙精度變量都可以直接運(yùn)用加法運(yùn)算符+來(lái)求和。但是類屬于新構(gòu)造的數(shù)據(jù)類型,類的兩個(gè)對(duì)象就無(wú)法通過加法運(yùn)算符來(lái)求和。例如:

#include<bits/stdc++.h>
using namespace std;
class CBook{
	public:
		CBook(int iPage){
			m_iPage=iPage;
		}
		void display(){
			cout<<m_iPage<<endl;
		}
	protected:
		int m_iPage;
};
int main(void){
	CBook book1(10);
	CBook book2(20);
	tmp=book1+book2;//錯(cuò)誤
	tmp.display(); 
}

當(dāng)編譯器編譯到語(yǔ)句book1+book2時(shí)會(huì)報(bào)錯(cuò),因?yàn)榫幾g器不知道如何進(jìn)行兩個(gè)對(duì)象的相加,要實(shí)現(xiàn)兩個(gè)類對(duì)象的加法運(yùn)算有兩種方法,一種是通過成員函數(shù),一種是通過重載運(yùn)算符。

首先看通過成員函數(shù)方法實(shí)現(xiàn)求和的例子:

#include<bits/stdc++.h>
using namespace std;
class CBook{
	public:
		CBook(int iPage){
			m_iPage=iPage;
		}
		int add(CBook a){
			return m_iPage+a.m_iPage;
		}
		void display(){
			cout<<m_iPage<<endl;
		}
	protected:
		int m_iPage;
};
int main(void){
	CBook book1(10);
	CBook book2(20);
	cout<<book1.add(book2)<<endl;
}

程序運(yùn)行結(jié)果正確。使用成員函數(shù)實(shí)現(xiàn)求和的形式比較單一,并且不利于代碼復(fù)用。如果要實(shí)現(xiàn)多個(gè)對(duì)象的累加其代碼的可讀性會(huì)大大降低,使用重載運(yùn)算符的方法可以解決這些問題。

2.重載運(yùn)算符的形式與規(guī)則

重載運(yùn)算符的聲明形式如下:

operator類型名():

operator是需要重載的運(yùn)算符,整個(gè)語(yǔ)句沒有返回類型,因?yàn)轭愋兔痛砹怂姆祷仡愋?。重載運(yùn)算符將對(duì)象轉(zhuǎn)化成類型名規(guī)定的類型,轉(zhuǎn)換時(shí)的形式就像強(qiáng)制轉(zhuǎn)換一樣。但如果沒有重載運(yùn)算符定義,直接強(qiáng)制類型轉(zhuǎn)換會(huì)導(dǎo)致編譯器將無(wú)法通過編譯。

重載運(yùn)算符不可以是新創(chuàng)建的運(yùn)算符,只能是C++語(yǔ)言中已有的運(yùn)算符,可以重載的運(yùn)算符如下:

算術(shù)運(yùn)算符:+ - * / % ++ --

位操作運(yùn)算符:& | ~ ^ >> <<

邏輯運(yùn)算符 ! && ||

比較運(yùn)算符 <  >  >=  <=  ==  !=

賦值運(yùn)算符 =   +=    -=    *=  /=  %=    &=  |=   ^=     <<=    >>=

其他運(yùn)算符: [ ]   ()   ->   ,    new    delete    new[]    delete[]        ->*

并不是所有的C++語(yǔ)言中已有的運(yùn)算符都可以重載,不允許重載的運(yùn)算符有 .  *  ::    ?和:

重載運(yùn)算符時(shí)不能改變運(yùn)算符操作數(shù)的個(gè)數(shù),不能改變運(yùn)算符原有的優(yōu)先級(jí),不能改變運(yùn)算符原有的結(jié)合性,不能改變運(yùn)算符原有的語(yǔ)法結(jié)構(gòu),即單目運(yùn)算符只能重載為單目運(yùn)算符,雙目運(yùn)算符只能重載為雙目運(yùn)算符,重載運(yùn)算符含義必須清楚,不能有二義性。

實(shí)例:通過重載運(yùn)算符實(shí)現(xiàn)求和:

#include<bits/stdc++.h>
using namespace std;
class CBook{
	public:
		CBook(int iPage){
			m_iPage=iPage;
		}
		CBook operator+(CBook b)
		{
			return CBook(m_iPage+b.m_iPage);
		}
		void display(){
			cout<<m_iPage<<endl;
		}
	protected:
		int m_iPage;
};
int main(void){
	CBook book1(10);
	CBook book2(20);
	CBook tmp(0);
	tmp=book1+book2;
	tmp.display();
}

類CBook重載了求和運(yùn)算符后,由它聲明的兩個(gè)對(duì)象book1和book2可以向兩個(gè)整型變量一樣相加。

3.重載運(yùn)算符的運(yùn)算

重載運(yùn)算符后可以完成對(duì)象和對(duì)象之間的運(yùn)算,同樣也可以通過重載運(yùn)算實(shí)現(xiàn)對(duì)象和普通類型數(shù)據(jù)的運(yùn)算。例如:

#include<bits/stdc++.h>
using namespace std;
class CBook{
	public:
		int m_Pages;
	void OutputPage(){
		cout<<m_Pages<<endl;
	}
	CBook(){
		m_Pages=0;
	}
	CBook operator+(const int page){
		CBook book;
		book.m_Pages=m_Pages+page;
		return book;
	}
};
int main(void){
	CBook Book1,Book2;
	Book2=Book1+10;
	Book2.OutputPage(); 
}

通過修改運(yùn)算符的參數(shù)為整數(shù)類型,可以實(shí)現(xiàn)CBook對(duì)象與整數(shù)相加。

對(duì)于兩個(gè)整型變量的相加,可以調(diào)換加數(shù)和被加數(shù)的順序,因?yàn)榧臃ǚ辖粨Q律。但是對(duì)于通過重載運(yùn)算符實(shí)現(xiàn)的加法,不可以交換順序。

illegal:

Book2=10+Book1;//非法代碼

對(duì)于++和--運(yùn)算符,由于涉及前置運(yùn)算和后置運(yùn)算,在重載這類運(yùn)算符時(shí)如何區(qū)分呢?默認(rèn)情況是,如果重載運(yùn)算符沒有參數(shù)則表示是前置運(yùn)算,例如:

void operator++()//前置運(yùn)算 
{
	++m_Pages;
}

如果重載運(yùn)算符使用了整數(shù)作為參數(shù),則表示的是后置運(yùn)算,此時(shí)的參數(shù)值可以被忽略,它只是一個(gè)標(biāo)識(shí),標(biāo)識(shí)后置運(yùn)算。

void operator++(int)//后置運(yùn)算 
{
	++m_Pages;
}

默認(rèn)情況下,將一個(gè)整數(shù)賦值給一個(gè)對(duì)象是非法的,可以通過重載運(yùn)算符將其變成合法的。例如:

void operator = (int page){//重載運(yùn)算符 
	m_Pages=page;
}

通過重載運(yùn)算符也可以實(shí)現(xiàn)將一個(gè)整型數(shù)復(fù)制給一個(gè)對(duì)象,例如:

#include<bits/stdc++.h>
using namespace std;
class CBook{
	public:
		int m_Pages;
		void OutputPages()
		{
			cout<<m_Pages<<endl;
		}
	CBook(int page){
		m_Pages=page;
	}
	operator = (const int page){
		m_Pages=page;
	}
}; 
int main(void){
	CBook mybook(0);
	mybook = 100;
	mybook.OutputPages();
}

程序中重載了賦值運(yùn)算符,給mybook對(duì)象賦值100,并通過OutpuName()函數(shù)將其進(jìn)行輸出。

也可以通過重載構(gòu)造函數(shù)將一個(gè)整數(shù)賦值給一個(gè)對(duì)象

#include<bits/stdc++.h>
using namespace std;
class CBook{
	public:
		int m_Pages;
		void OutputPages()
		{
			cout<<m_Pages<<endl;
		}
	CBook(){
	}
	CBook(int page){
		m_Pages=page;
	}
	
}; 
int main(void){
	CBook mybook;
	mybook = 100;
	mybook.OutputPages();
}

程序中定義了一個(gè)重載的構(gòu)造函數(shù),以一個(gè)整數(shù)作為函數(shù)參數(shù),這就可以將一個(gè)整數(shù)賦值給一個(gè)CBook類的對(duì)象,語(yǔ)句mybook=100;將調(diào)用構(gòu)造函數(shù)CBook(int page)重新構(gòu)造一個(gè)CBook對(duì)象,并將其賦值給mybook對(duì)象。

4.轉(zhuǎn)義運(yùn)算符

C++語(yǔ)言中普通的數(shù)據(jù)類型可以進(jìn)行強(qiáng)制類型轉(zhuǎn)換,例如:

int i=10;
double d;
d = double(i)

程序中將整數(shù)i強(qiáng)制轉(zhuǎn)換為double型。

語(yǔ)句

d=double(i)//等同于d=double(i)

double()在C++語(yǔ)言中被轉(zhuǎn)化為轉(zhuǎn)換運(yùn)算符。通過重載轉(zhuǎn)換運(yùn)算符可以將類對(duì)象轉(zhuǎn)換為想要的數(shù)據(jù)。

實(shí)例:轉(zhuǎn)換運(yùn)算符

#include<bits/stdc++.h>
using namespace std;
class CBook{
	public:
		CBook(double iPage=0);
		operator double(){
			return m_iPage;
		}
	protected:
		int m_iPage;
}; 
CBook::CBook(double iPage){
	m_iPage = iPage;
}
int main(void){
	CBook book1(10.0);
	CBook book2(20.00);
	cout<<double(book1)+double(book2)<<endl;
}

程序重載了轉(zhuǎn)換運(yùn)算符double(),然后將類CBook的兩個(gè)對(duì)象強(qiáng)制轉(zhuǎn)換為double類型后再進(jìn)行求和,最后輸出求和的結(jié)果。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!     

相關(guān)文章

最新評(píng)論

郎溪县| 潞西市| 运城市| 鄂尔多斯市| 长泰县| 桦甸市| 宁强县| 双鸭山市| 乳源| 临泉县| 雅安市| 毕节市| 娱乐| 五华县| 仙游县| 灵武市| 汝州市| 平顶山市| 科技| 灵台县| 类乌齐县| 阿拉尔市| 民勤县| 宣武区| 石泉县| 五家渠市| 古丈县| 任丘市| 灵寿县| 叙永县| 沅江市| 科技| 清镇市| 襄垣县| 方城县| 北安市| 岗巴县| 牡丹江市| 海丰县| 大荔县| 尚义县|