中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++重載運算符是實例分析

發布時間:2022-03-28 09:10:22 來源:億速云 閱讀:147 作者:iii 欄目:開發技術

本篇內容介紹了“C++重載運算符是實例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

運算符實際上是一個函數,所以運算符的重載實際上是函數的重載,。編譯程序對運算符的重載的選擇,遵循函數重載的選擇原則。當遇到不很明顯的運算時,編譯程序會尋找與參數相匹配的運算符函數。

1.重載運算符的必要性

C++語言中的數據類型分為基本數據類型和構造數據類型。基本數據類型可以直接完成算術運算。例如:

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

程序中實現了兩個整型變量的相加,可以正確輸出運行結果30。通過兩個浮點變量、兩個雙精度變量都可以直接運用加法運算符+來求和。但是類屬于新構造的數據類型,類的兩個對象就無法通過加法運算符來求和。例如:

#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;//錯誤
	tmp.display(); 
}

當編譯器編譯到語句book1+book2時會報錯,因為編譯器不知道如何進行兩個對象的相加,要實現兩個類對象的加法運算有兩種方法,一種是通過成員函數,一種是通過重載運算符。

首先看通過成員函數方法實現求和的例子:

#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;
}

程序運行結果正確。使用成員函數實現求和的形式比較單一,并且不利于代碼復用。如果要實現多個對象的累加其代碼的可讀性會大大降低,使用重載運算符的方法可以解決這些問題。

2.重載運算符的形式與規則

重載運算符的聲明形式如下:

operator類型名():

operator是需要重載的運算符,整個語句沒有返回類型,因為類型名就代表了它的返回類型。重載運算符將對象轉化成類型名規定的類型,轉換時的形式就像強制轉換一樣。但如果沒有重載運算符定義,直接強制類型轉換會導致編譯器將無法通過編譯。

重載運算符不可以是新創建的運算符,只能是C++語言中已有的運算符,可以重載的運算符如下:

算術運算符:+ - * / % ++ --

位操作運算符:& | ~ ^ >> <<

邏輯運算符 ! && ||

比較運算符 <  >  >=  <=  ==  !=

賦值運算符 =   +=    -=    *=  /=  %=    &=  |=   ^=     <<=    >>=

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

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

重載運算符時不能改變運算符操作數的個數,不能改變運算符原有的優先級,不能改變運算符原有的結合性,不能改變運算符原有的語法結構,即單目運算符只能重載為單目運算符,雙目運算符只能重載為雙目運算符,重載運算符含義必須清楚,不能有二義性。

實例:通過重載運算符實現求和:

#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重載了求和運算符后,由它聲明的兩個對象book1和book2可以向兩個整型變量一樣相加。

3.重載運算符的運算

重載運算符后可以完成對象和對象之間的運算,同樣也可以通過重載運算實現對象和普通類型數據的運算。例如:

#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(); 
}

通過修改運算符的參數為整數類型,可以實現CBook對象與整數相加。

對于兩個整型變量的相加,可以調換加數和被加數的順序,因為加法符合交換律。但是對于通過重載運算符實現的加法,不可以交換順序。

illegal:

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

對于++和--運算符,由于涉及前置運算和后置運算,在重載這類運算符時如何區分呢?默認情況是,如果重載運算符沒有參數則表示是前置運算,例如:

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

如果重載運算符使用了整數作為參數,則表示的是后置運算,此時的參數值可以被忽略,它只是一個標識,標識后置運算。

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

默認情況下,將一個整數賦值給一個對象是非法的,可以通過重載運算符將其變成合法的。例如:

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

通過重載運算符也可以實現將一個整型數復制給一個對象,例如:

#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();
}

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

也可以通過重載構造函數將一個整數賦值給一個對象

#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();
}

程序中定義了一個重載的構造函數,以一個整數作為函數參數,這就可以將一個整數賦值給一個CBook類的對象,語句mybook=100;將調用構造函數CBook(int page)重新構造一個CBook對象,并將其賦值給mybook對象。

4.轉義運算符

C++語言中普通的數據類型可以進行強制類型轉換,例如:

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

程序中將整數i強制轉換為double型。

語句

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

double()在C++語言中被轉化為轉換運算符。通過重載轉換運算符可以將類對象轉換為想要的數據。

實例:轉換運算符

#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;
}

程序重載了轉換運算符double(),然后將類CBook的兩個對象強制轉換為double類型后再進行求和,最后輸出求和的結果。

“C++重載運算符是實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

乌拉特前旗| 个旧市| 上蔡县| 阳城县| 丰县| 承德县| 手游| 武威市| 姚安县| 永兴县| 勃利县| 高台县| 东港市| 鹤山市| 大兴区| 龙泉市| 习水县| 新疆| 绵阳市| 龙游县| 沾益县| 无极县| 明光市| 临海市| 梁山县| 广东省| 随州市| 博白县| 攀枝花市| 汶川县| 韶山市| 平昌县| 平和县| 襄垣县| 锦屏县| 鄂州市| 牡丹江市| 滦平县| 临沧市| 萝北县| 鄯善县|