十分鐘理解C ++中的運算符重載

2020-11-28 51CTO

在C ++中,我們可以使運算符為用戶定義的類工作。這意味著C ++能夠為運算符提供數據類型的特殊含義,這種能力稱為運算符重載。

例如,我們可以在String之類的類中重載運算符'+',以便僅使用+就可以連接兩個字符串。 算術運算符可能會重載的其他示例類是複數,小數,大整數等。

一個簡單而完整的例子

  1. #include<iostream>  
  2. using namespace std;  
  3.    
  4. class Complex {  
  5. private:  
  6.     int real, imag;  
  7. public:  
  8.     Complex(int r = 0, int i =0)  {real = r;   imag = i;}  
  9.     Complex operator + (Complex const &obj) {  
  10.          Complex res;  
  11.          res.real = real + obj.real;  
  12.          res.imag = imag + obj.imag;  
  13.          return res;  
  14.     }  
  15.     void print() { cout << real << " + i" << imag << endl; }  
  16. };  
  17.    
  18. int main()  
  19. {  
  20.     Complex c1(10, 5), c2(2, 4);  
  21.     Complex c3 = c1 + c2;  
  22.     c3.print();  
  23. }  

操作員功能和普通功能有什麼區別?

操作員功能與普通功能相同。唯一的區別是,運算符的名稱始終是運算符關鍵字,後跟運算符的符號,並且在使用相應的運算符時會調用運算符功能。

以下是全局運算符功能的示例。

  1. #include<iostream>  
  2. using namespace std;  
  3.    
  4. class Complex {  
  5. private:  
  6.     int real, imag;  
  7. public:  
  8.     Complex(int r = 0, int i =0)  {real = r;   imag = i;}  
  9.     void print() { cout << real << " + i" << imag << endl; }  
  10.  
  11. friend Complex operator + (Complex const &, Complex const &);  
  12. };  
  13.    
  14.    
  15. Complex operator + (Complex const &c1, Complex const &c2)  
  16. {  
  17.      return Complex(c1.real + c2.real, c1.imag + c2.imag);  
  18. }  
  19.    
  20.    
  21. int main()  
  22. {  
  23.     Complex c1(10, 5), c2(2, 4);  
  24.     Complex c3 = c1 + c2;  
  25.     c3.print();  
  26.     return 0;  
  27. }  

我們可以讓所有運算符超負荷嗎?

除了少數操作員之外,幾乎所有操作員都可以重載。以下是不能重載的運算符的列表。

為什麼不能。(點),::,?:和sizeof是否過載?

請參閱此以獲取Stroustrup自己的答案。

關於運算符重載的要點

1)為了使運算符重載起作用,至少一個操作數必須是用戶定義的類對象。

2) 賦值運算符:編譯器會自動為每個類創建一個默認的賦值運算符。默認賦值運算符確實將右側的所有成員分配到左側,並且在大多數情況下都可以正常工作(此行為與複製構造函數相同)。請參閱此了解更多詳情。

3) 轉換運算符:我們還可以編寫可用於將一種類型轉換為另一種類型的轉換運算符。

  1. #include <iostream>  
  2. using namespace std;  
  3. class Fraction  
  4. {  
  5.     int num, den;  
  6. public:  
  7.     Fraction(int n,  int d) { num = n; den = d; }  
  8.  
  9.     operator float() const {  
  10.         return float(num) / float(den);  
  11.     }  
  12. };  
  13.    
  14. int main() {  
  15.     Fraction f(2, 5);  
  16.     float val = f;  
  17.     cout << val;  
  18.     return 0;  
  19. }  

重載的轉換運算符必須是成員方法。其他運算符可以是成員方法或全局方法。

4)任何可以用單個參數調用的構造函數都可以用作轉換構造函數,這意味著它也可以用於隱式轉換為正在構造的類。

  1. #include<iostream>   
  2. using namespace std;  
  3.    
  4. class Point  
  5. {  
  6. private:  
  7.     int x, y;  
  8. public:  
  9.     Point(int i = 0, int j = 0) {  
  10.         x = i;   y = j;  
  11.     }  
  12.     void print() {  
  13.         cout << endl << " x = " << x << ", y = " << y;  
  14.     }  
  15. };  
  16.    
  17. int main() {  
  18.     Point t(20, 20);  
  19.     t.print();  
  20.     t = 30;    
  21.     t.print();  
  22.     return 0;  

【編輯推薦】

【責任編輯:

華軒

TEL:(010)68476606】

點讚 0

相關焦點

  • 運算符重載(多態):最通俗易懂的「重載」解釋(附代碼)
    在面向對象的編程方法中,有一種使對象操作更美觀、更人性化,更方便的編程技術:重載!本文將以簡單的代碼與理論對運算符重載做詳細解釋以供大家學習、參考!運算符重載什麼是重載?——以C++為例以運算符「+」為例,通常情況下,我們使用加號的方式如下:int a=2, b=3, c=4;a=b+c;功能就是將int類型的兩個變量b,c算術相加,返回int類型的值並賦值給變量
  • c++ 內存,虛函數,運算函數,三角函數
    堆:這是程序中未使用的內存,在程序運行時可用於動態分配內存。很多時候,您無法提前預知需要多少內存來存儲某個定義變量中的特定信息,所需內存的大小需要在運行時才能確定。在 C++ 中,您可以使用特殊的運算符為給定類型的變量在運行時分配堆內的內存,這會返回所分配的空間地址。
  • 數據類型、運算符和表達式
    知道C語言裡面數據的一些基本情況後再來了解數據的運算,也就是C語言裡面怎麼進行加減乘除這些。運算符就是+-×÷這些符號,C語言裡面的符號也有很多種,下表是比較全的概括:這些運算符目前只需要了解它的作用,不用記,後期應用過程中自然會熟悉並了解。
  • C語言中的運算符和表達式
    二、算術運算符和算術表達式對計算機中數據進行算術運算的運算符,稱為算術運算符,包括數學中學到的加減乘除和一些擴展。5、自增和自減運算符自增運算符為「++」,自減運算符為「--」。自增運算符使運算對象遞增1,有兩種形式:運算符在變量的左側,稱前綴模式,運算符在變量的右側,稱後綴模式。
  • C++中函數重載的例子
    函數重載是指在同一作用域內,可以有一組具有相同函數名,不同參數列表的函數,這組函數被稱為重載函數。重載函數通常用來命名一組功能相似的函數,這樣做減少了函數名的數量,避免了名字空間的汙染,對於程序的可讀性有很大的好處。
  • 單片機c語言教程:運算符和表達式(關係運算符)
    單片機C語言中有六種關係運算符,這些東西同樣是在我們小時候學算術時就已經學習過了的:本文引用地址:http://www.eepw.com.cn/article/170887.htm> 大於< 小於>= 大於等於<= 小於等於== 等於
  • Python語言教程算術運算與算術表達式的介紹
    一個表達式可以分解為運算符和操作數,運算符的功能是完成某件事,它們由一些數學運算符號或者其他特定的關鍵字表示;運算符需要數據來進行運算,這樣的數據被稱為操作數。例如,2 + 3是一個簡單的表達式,其中+是運算符,2和3是操作數。算術運算符與算術表達式算術運算符是程序設計語言最基本的運算符。
  • 「C語言從入門到入土」必備C語言基礎筆記整理
    無論跟它說什麼,都得用它能理解的方式做出充分的說明。反正,都是你的錯。c。2、邏輯運算符優先次序(1)次序依次是!(非)算術運算符(+、-、*、/)關係運算符(>、<、<=、>=)&&(與)||(或)賦值運算符(=)注意:與的運算符優先於或
  • C語言丨關於位運算的使用,只需掌握這4個簡單示例!
    位運算是指按二進位進行的運算。在系統軟體中,常常需要處理二進位位的問題。C語言提供了6個位操作運算符。這些運算符只能用於整型操作數,即只能用於帶符號或無符號的char,short,int與long類型。
  • 利用圖片理解矩陣的線性運算
    利用圖片理解矩陣的線性運算 圖片的儲存方式 在計算機中,按照顏色和灰度的多少可以將圖像分為二值圖像、灰度圖像、索引圖像和真彩RGB圖像四種基本類型。
  • 理解項
    表達式的優先級只是其主運算符的優先級,如果括在括號中,則為0。 3 + 4的主運算符是+,因此將2 + 3 + 4解釋為+(2,+(3,4))意味著第一個+右側的表達式與+本身具有相同的優先級,這是非法的。它必須更低。 運算符==,=:=和 is 被定義為非關聯的,這意味著它們的兩個參數都必須具有較低的優先級。
  • Python集合中的四種運算:交集、併集、差集和對稱差集運算
    在春天繼續學習Python集合,應用在Python當中是作為一種序列存在的,同時在Python中,也可以進行集合的一般運算,比如交集運算、併集運算和差集運算。先來看一下Python中對這幾種集合概念的定義。交集,就是兩個集合相交的部分,運算符為「&」;併集,就是合併在一起的集合,運算符為「|」;差集,就是兩個集合之差,運算符為「-」;最後還有一個對稱差集,運算符為「^」。
  • ——四則運算順序和運算律的理解型學習
    我一會兒再來批判,先正面來說明,每一項四則運算的規則是如何通過理解來學習的,而不是死記硬背。首先,為什麼要規定先乘除後加減這個順序?我們來考慮a+b×c,在沒有約定計算順序的情況下,這個算式可以做兩種不同的理解:(a+b)×c或者a+(b×c)。
  • 「Java」基礎19:修飾符有哪些?
    這就得學到一個新的修飾符了。一、final修飾符final,翻譯成中文就是「不可更改的 」。顧名思義,它是一個修飾符,用於修改不可更改的內容。被final修飾的類:不能被繼承。被final修飾的方法:不能被重寫。被final修飾的變量:不能被重新賦值。被final修飾的常量:名稱一般都有書寫規範,所有字母都大寫。
  • C語言程序設計試題與答案B卷
    本程序的main函數開始,到main函數結束 B)本程序文件的第一個函數開始,到本程序文件的最後一個函數結束C)本程序的main函數開始,到本程序文件的最後一個函數結束D)本程序文件的第一個函數開始,到本程序main函數結束3、下列的標識符非法的是
  • 在.NET中,C#舉例深度理解面向對象編程中的封裝、繼承和多態
    例如:我們計算2個操作數的四則運算,此時我們就可以單獨創建一個類,將所有與數字相關的計算全部放在此類中,使用時就實例化該類,從對象中調用方法即可,這樣就做到與數字相關的操作封裝到一個類中。在C#中,同名方法表現出不同的操作有重載和重寫:(1). 重載:表現的是方法的參數類型或參數個數不同。(2). 重寫:表現的是可以覆蓋掉基類同名方法的邏輯代碼。在多態中,重寫屬於運行期的多態,重載屬於編譯期的多態。
  • python教程之python數學運算
    (fraction)運算分數運算是python中的一個模塊(module)。#對分數進行運算>>> Fraction(2,8)+1+1.52.75運算中如果出現float數據類型,最終的結果將是float類型數據。如果運算式中只有integer類型和fraction類型,輸出結果將是fraction類型。
  • 單片機c語言教程:C51運算符和表達式
    typedef 的語法是typedef 已有的數據類型 新的數據類型名 運算符就是完成某種特定運算的符號。運算符按其表達式中與運算符的關係可分為單目運算符,雙目運算符和三目運算符。單目就是指需要有一個運算對象,雙目就要求有兩個運 算對象,三目則要三個運算對象。
  • React學習筆記-條件渲染|javascript|運算符|react|render_網易訂閱
    在 React 中,你可以創建不同的組件來封裝各種你需要的行為。然後還可以根據應用的狀態變化只渲染其中的一部分。React 中的條件渲染和 JavaScript 中的一致,使用 JavaScript 操作符 if 或條件運算符來創建表示當前狀態的元素,然後讓 React 根據它們來更新 UI。