網站首頁 編程語言 正文
運算符實際上是一個函數,所以運算符的重載實際上是函數的重載,。編譯程序對運算符的重載的選擇,遵循函數重載的選擇原則。當遇到不很明顯的運算時,編譯程序會尋找與參數相匹配的運算符函數。
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類型后再進行求和,最后輸出求和的結果。
總結
原文鏈接:https://blog.csdn.net/Li5566123/article/details/123754077
相關推薦
- 2022-01-13 使用postcss插件配置rem和手寫rem的方法
- 2022-06-07 使用Docker容器部署rocketmq單機的全過程_docker
- 2022-10-06 Python?Numpy中數組的集合操作詳解_python
- 2022-10-03 C++深入探究重載重寫覆蓋的區別_C 語言
- 2022-08-26 Jquery實現下拉菜單案例_jquery
- 2022-05-01 C#使用log4net打日志_C#教程
- 2022-05-18 解決iOS驗證碼顯示在左邊問題_IOS
- 2022-07-22 防火墻.iptables-tcp-flags防止nmap端口掃描
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支