<一>關於運算符重載

来源:https://www.cnblogs.com/erichome/archive/2022/11/20/16909682.html
-Advertisement-
Play Games

C++的運算符重載:使對象的運算表現得和編譯器內置類型一樣 如下代碼,如果T是整形,那很好理解,但是如果 T 是一個 Student 類, a + b ?怎麼操作,兩個學生類怎麼相加? 這個就是我們要說的運算符重載問題 template T sum(T a,T b){ return a + b; / ...


C++的運算符重載:使對象的運算表現得和編譯器內置類型一樣
如下代碼,如果T是整形,那很好理解,但是如果 T 是一個 Student 類, a + b ?怎麼操作,兩個學生類怎麼相加?
這個就是我們要說的運算符重載問題
template
T sum(T a,T b){
return a + b; // a.+(b) => a.operator+(b) operator+ 就是我們需要的函數
}

CComplex operator+(const CComplex &lhs, const CComplex &rhs){

   reutrn CComlex(lhs.x+rhs.x,lhs.y+rhs.y);
   // 由於不能再類外訪問CComplex的私有成員,所以我們可以加上友元
   // 在CComplex 加上 firend CComplex operator+(const CComplex &lhs, const CComplex &rhs);

}

ostream & operator<<(ostream & cout, const CComplex & val){
    cout<<"Complex = "<<val.x <<" "<<val.y<<endl;
    return out
}



class CComplex{

public:
  CComplex(int _x=1,int _y=1):x(_x),y(_y){}

  Complex operator+(const CComplex & _com){
       CComplex _comp;
       _comp.x= this->x + _com.x
       _comp.y= this->y +_com.y;
       return _comp;
  }

  //後置++,返回的是 + 之前的值
  Complex operator++(int){
     CComplex tep=*this;
     x++;
     y++;
     return tep;
  }

  //前置++ 返回加後的值
  Complex & operator++(){
     x++;
     y++;
     return *this;
  }

  //+=不需要返回值
  void operator+=(const CComplex & _value){
      x=x+_value.x;
      y=y+_value.y;
  }


private:
    int x;
    int y;
    firend CComplex operator+(const CComplex &lhs, const CComplex &rhs);
    firend ostream & operator<<(ostream & cout, const CComplex & val) ;
}

int main(){
    
    CComplex comp1(100,200);
    CComplex comp2(1,2);
    CComplex  comp3=comp1 + comp2;


    CComplex  comp4=comp1 + 20;//comp1.operator+(CComplex tep) => comp1.operator+(將20轉為CComplex對象) 
   //這個時候編譯器會想辦法 把 20轉為CComplex對象,在上面的類中,可以轉,因為 CComplex(int _x=1,int _y=1) 有預設值
   //所以上面代碼 會使用20創建一個CComplex 對象,然後 再讓他們相加

   CComplex  comp5=30 +comp1;//編譯報錯 30.operator+(CComplex tep)  整形數的加法運算符裡面沒有operator+(CComplex tep) 編譯器不會把30轉為CComplex對象
   
   //編譯器在做對象的運算的時候,會調用對象的運算符重載函數(優先調用成員方法),r如果沒有成員方法
   //就會在全局作用域中找合適的運算符重載函數 所以 CComplex  comp5=30 +comp1 編譯器
   //當在整數中找不到成員方法是,還可以 ::operator+(30,comp1) 在全局作用域中找運算符重載函數
   //就會調用全局作用域中的 CComplex operator+(const CComplex &lhs, const CComplex &rhs) 方法,
   //所以如果希望CComplex  comp5=30 +comp1;編譯通過,可以加上全局函數 CComplex operator+(const CComplex &lhs, const CComplex &rhs)


   return 0;
}



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 世界上的開源許可證(Open Source License)大概有上百種,而我們常用的開源軟體協議大致有GPL、BSD、MIT、Mozilla、Apache和LGPL。 從下圖中可以看出幾種開源軟體協議的區別。 以下是上述協議的簡單介紹: GPL GNU是GNU General Public Lic ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 作者: 如常 Debezium Incremental snapshotting Introduction CDC(Change-Data-Captur ...
  • 資料庫面試測試題(一) 簡述當前主流RDBMS軟體有哪些?開源且跨平臺的資料庫軟體有哪些? 參考答案 當前主流的資料庫伺服器軟體有: Oracle 、 DB2 、 SQL SERVER 、MySQL 等 ,其中只有MySQL是既開源又跨平臺的資料庫服務軟體。 簡述MySQL資料庫的服務進程名、預設端 ...
  • 1、文本類指令 {{}}、v-text 都是用於綁定節點的文本; 二者區別:{{}}這種綁定值的方式在頁面會出現“{{}}”一閃而過的效果 解決{{}}在頁面出現一閃而過的辦法: // css: [v-cloak] { display: 'none' }// html <h1 v-cloak>{{m ...
  • 5.10 介面開發-分片上傳 第2-1-2章 傳統方式安裝FastDFS-附FastDFS常用命令 第2-1-3章 docker-compose安裝FastDFS,實現文件存儲服務 第2-1-5章 docker安裝MinIO實現文件存儲服務-springboot整合minio-minio全網最全的資 ...
  • static_assert是c++11添加的新語法,它可以使我們在編譯期間檢測一些斷言條件是否為真,如果不滿足條件將會產生一條編譯錯誤信息。 使用靜態斷言可以提前暴露許多問題到編譯階段,極大的方便了我們對代碼的排錯,提前將一些bug扼殺在搖籃里。 然而有時候靜態斷言並不能如我們預期的那樣工作,今天就 ...
  • # 1.函數的作用域 # 全局變數的作用域: # 一般在函數體外定義的變數成為全局變數,在函數內部定義的變數稱為局部變數。 # 全局變數所有作用域都可用,局部變數只能在本函數可用,變 # 量的使用順序是,局部變數 > 全局變數, 也就是說:優先使用局部變數 # # global關鍵字: # 為瞭解決 ...
  • WEB開發會話技術01 1.會話 Web開發中,用到的4種會話跟蹤技術 - 博客園 (cnblogs.com) 會話的基本介紹 什麼是會話? 會話可簡單理解為:用戶開一個瀏覽器,點擊多個超鏈接,訪問伺服器多個web資源,然後關閉瀏覽器,整個過程稱之為一個會話。 會話過程中要解決的一些問題: (1)每 ...
一周排行
    -Advertisement-
    Play Games
  • 不廢話,直接代碼 private Stack<Action> actionStack = new Stack<Action>(); private void SetCellValues() { var worksheet = Globals.ThisAddIn.Application.ActiveS ...
  • OpenAPI 規範是用於描述 HTTP API 的標準。該標準允許開發人員定義 API 的形狀,這些 API 可以插入到客戶端生成器、伺服器生成器、測試工具、文檔等中。儘管該標準具有普遍性和普遍性,但 ASP.NET Core 在框架內預設不提供對 OpenAPI 的支持。 當前 ASP.NET ...
  • @DateTimeFormat 和 @JsonFormat 是 Spring 和 Jackson 中用於處理日期時間格式的註解,它們有不同的作用: @DateTimeFormat @DateTimeFormat 是 Spring 框架提供的註解,用於指定字元串如何轉換為日期時間類型,以及如何格式化日 ...
  • 一、背景說明 1.1 效果演示 用python開發的爬蟲採集軟體,可自動抓取抖音評論數據,並且含二級評論! 為什麼有了源碼還開發界面軟體呢?方便不懂編程代碼的小白用戶使用,無需安裝python、無需懂代碼,雙擊打開即用! 軟體界面截圖: 爬取結果截圖: 以上。 1.2 演示視頻 軟體運行演示視頻:見 ...
  • SpringBoot筆記 SpringBoot文檔 官網: https://spring.io/projects/spring-boot 學習文檔: https://docs.spring.io/spring-boot/docs/current/reference/html/ 線上API: http ...
  • 作為後端工程師,多數情況都是給別人提供介面,寫的好不好使你得重視起來。 最近我手頭一些活,需要和外部公司對接,我們需要提供一個介面文檔,這樣可以節省雙方時間、也可以防止後續扯皮。這是就要考驗我的介面是否規範化。 1. 介面名稱清晰、明確 顧名思義,介面是做什麼的,是否準確、清晰?讓使用這一眼就能知道 ...
  • 本文介紹基於Python語言,遍歷文件夾並從中找到文件名稱符合我們需求的多個.txt格式文本文件,並從上述每一個文本文件中,找到我們需要的指定數據,最後得到所有文本文件中我們需要的數據的合集的方法~ ...
  • Java JUC&多線程 基礎完整版 目錄Java JUC&多線程 基礎完整版1、 多線程的第一種啟動方式之繼承Thread類2、多線程的第二種啟動方式之實現Runnable介面3、多線程的第三種實現方式之實現Callable介面4、多線的常用成員方法5、線程的優先順序6、守護線程7、線程的讓出8、線 ...
  • 實時識別關鍵詞是一種能夠將搜索結果提升至新的高度的API介面。它可以幫助我們更有效地分析文本,並提取出關鍵詞,以便進行進一步的處理和分析。 該介面是挖數據平臺提供的,有三種模式:精確模式、全模式和搜索引擎模式。不同的模式在分詞的方式上有所不同,適用於不同的場景。 首先是精確模式。這種模式會儘量將句子 ...
  • 1 為啥要折騰搭建一個專屬圖床? 技術大佬寫博客都用 md 格式,要在多平臺發佈,圖片就得有外鏈 後續如博客遷移,國內博客網站如掘金,簡書,語雀等都做了防盜鏈,圖片無法遷移 2 為啥選擇CloudFlare R2 跳轉:https://dash.cloudflare.com/ 有白嫖額度 免費 CD ...