C++重載運算符你真的了解嗎
運算符實際上是一個函數(shù),所以運算符的重載實際上是函數(shù)的重載,。編譯程序?qū)\算符的重載的選擇,遵循函數(shù)重載的選擇原則。當遇到不很明顯的運算時,編譯程序會尋找與參數(shù)相匹配的運算符函數(shù)。
1.重載運算符的必要性
C++語言中的數(shù)據(jù)類型分為基本數(shù)據(jù)類型和構(gòu)造數(shù)據(jù)類型?;緮?shù)據(jù)類型可以直接完成算術(shù)運算。例如:
#include<bits/stdc++.h>
using namespace std;
int main(void){
int a=10;
int b=20;
cout<<a+b<<endl;
} 程序中實現(xiàn)了兩個整型變量的相加,可以正確輸出運行結(jié)果30。通過兩個浮點變量、兩個雙精度變量都可以直接運用加法運算符+來求和。但是類屬于新構(gòu)造的數(shù)據(jù)類型,類的兩個對象就無法通過加法運算符來求和。例如:
#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時會報錯,因為編譯器不知道如何進行兩個對象的相加,要實現(xià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;
}程序運行結(jié)果正確。使用成員函數(shù)實現(xiàn)求和的形式比較單一,并且不利于代碼復(fù)用。如果要實現(xiàn)多個對象的累加其代碼的可讀性會大大降低,使用重載運算符的方法可以解決這些問題。
2.重載運算符的形式與規(guī)則
重載運算符的聲明形式如下:
operator類型名():
operator是需要重載的運算符,整個語句沒有返回類型,因為類型名就代表了它的返回類型。重載運算符將對象轉(zhuǎn)化成類型名規(guī)定的類型,轉(zhuǎn)換時的形式就像強制轉(zhuǎn)換一樣。但如果沒有重載運算符定義,直接強制類型轉(zhuǎn)換會導(dǎo)致編譯器將無法通過編譯。
重載運算符不可以是新創(chuàng)建的運算符,只能是C++語言中已有的運算符,可以重載的運算符如下:
算術(shù)運算符:+ - * / % ++ --
位操作運算符:& | ~ ^ >> <<
邏輯運算符 ! && ||
比較運算符 < > >= <= == !=
賦值運算符 = += -= *= /= %= &= |= ^= <<= >>=
其他運算符: [ ] () -> , new delete new[] delete[] ->*
并不是所有的C++語言中已有的運算符都可以重載,不允許重載的運算符有 . * :: ?和:
重載運算符時不能改變運算符操作數(shù)的個數(shù),不能改變運算符原有的優(yōu)先級,不能改變運算符原有的結(jié)合性,不能改變運算符原有的語法結(jié)構(gòu),即單目運算符只能重載為單目運算符,雙目運算符只能重載為雙目運算符,重載運算符含義必須清楚,不能有二義性。
實例:通過重載運算符實現(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重載了求和運算符后,由它聲明的兩個對象book1和book2可以向兩個整型變量一樣相加。
3.重載運算符的運算
重載運算符后可以完成對象和對象之間的運算,同樣也可以通過重載運算實現(xiàn)對象和普通類型數(shù)據(jù)的運算。例如:
#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();
}通過修改運算符的參數(shù)為整數(shù)類型,可以實現(xiàn)CBook對象與整數(shù)相加。
對于兩個整型變量的相加,可以調(diào)換加數(shù)和被加數(shù)的順序,因為加法符合交換律。但是對于通過重載運算符實現(xiàn)的加法,不可以交換順序。
illegal:
Book2=10+Book1;//非法代碼
對于++和--運算符,由于涉及前置運算和后置運算,在重載這類運算符時如何區(qū)分呢?默認情況是,如果重載運算符沒有參數(shù)則表示是前置運算,例如:
void operator++()//前置運算
{
++m_Pages;
}如果重載運算符使用了整數(shù)作為參數(shù),則表示的是后置運算,此時的參數(shù)值可以被忽略,它只是一個標識,標識后置運算。
void operator++(int)//后置運算
{
++m_Pages;
}默認情況下,將一個整數(shù)賦值給一個對象是非法的,可以通過重載運算符將其變成合法的。例如:
void operator = (int page){//重載運算符
m_Pages=page;
}通過重載運算符也可以實現(xiàn)將一個整型數(shù)復(fù)制給一個對象,例如:
#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()函數(shù)將其進行輸出。
也可以通過重載構(gòu)造函數(shù)將一個整數(shù)賦值給一個對象
#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òu)造函數(shù),以一個整數(shù)作為函數(shù)參數(shù),這就可以將一個整數(shù)賦值給一個CBook類的對象,語句mybook=100;將調(diào)用構(gòu)造函數(shù)CBook(int page)重新構(gòu)造一個CBook對象,并將其賦值給mybook對象。
4.轉(zhuǎn)義運算符
C++語言中普通的數(shù)據(jù)類型可以進行強制類型轉(zhuǎn)換,例如:
int i=10; double d; d = double(i)
程序中將整數(shù)i強制轉(zhuǎn)換為double型。
語句
d=double(i)//等同于d=double(i)
double()在C++語言中被轉(zhuǎn)化為轉(zhuǎn)換運算符。通過重載轉(zhuǎn)換運算符可以將類對象轉(zhuǎn)換為想要的數(shù)據(jù)。
實例:轉(zhuǎ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)換運算符double(),然后將類CBook的兩個對象強制轉(zhuǎn)換為double類型后再進行求和,最后輸出求和的結(jié)果。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Qt串口通信開發(fā)之QSerialPort模塊Qt串口通信接收數(shù)據(jù)不完整的解決方法
這篇文章主要介紹了Qt串口通信開發(fā)之QSerialPort模塊Qt串口通信接收數(shù)據(jù)不完整的解決方法,需要的朋友可以參考下2020-03-03
C++實現(xiàn)LeetCode(76.最小窗口子串)
這篇文章主要介紹了C++實現(xiàn)LeetCode(76.最小窗口子串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
VisualStudio類文件的管理(類文件的分離)的實現(xiàn)
在使用?Visual?Studio?開發(fā)項目的時候,學(xué)會進行“類文件的分離”十分重要,本文主要介紹了VisualStudio類文件的管理(類文件的分離)的實現(xiàn),感興趣的可以了解一下2024-03-03
Visual?Studio?2022?安裝低版本?.Net?Framework的圖文教程
這篇文章主要介紹了Visual?Studio?2022?如何安裝低版本的?.Net?Framework,首先打開?Visual?Studio?Installer?可以看到vs2022?只支持安裝4.6及以上的版本,那么該如何安裝4.6以下的版本,下面將詳細介紹,需要的朋友可以參考下2022-09-09

