C++ 運算符重載的基本概念

来源:https://www.cnblogs.com/xiaolincoding/archive/2019/12/01/11967836.html
-Advertisement-
Play Games

01 運算符重載的需求 C++ 預定義的運算符,只能用於基本數據類型的運算:整型、實型、字元型、邏輯型等等,且不能用於對象的運算。但是我們有時候又很需要在對象之間能用運算符,那麼這時我們就要 重載運算符 ,使得運算符能用於對象之間的運算。 比如,在數學上,兩個複數可以直接進行+、 等運算,但在C++ ...


01 運算符重載的需求

C++ 預定義的運算符,只能用於基本數據類型的運算:整型、實型、字元型、邏輯型等等,且不能用於對象的運算。但是我們有時候又很需要在對象之間能用運算符,那麼這時我們就要重載運算符,使得運算符能用於對象之間的運算。

比如,在數學上,兩個複數可以直接進行+、-等運算,但在C++中,直接將+或-用於複數對象是不允許的。有時會希望,讓對象也能通過運算符進行運算。這樣代碼就更簡潔,也容易理解。

例如:

complex_a 和 complex_b 是兩個複數對象,求兩個複數的和,希望的能直接寫成:complex_a + complex_b

這時我們就需要對 + 號運算符進行重載。


02 運算符重載的形式

運算符重載的實質就是函數重載,可以重載為普通函數,也可以重載為成員函數。運算符重載的基本形式如下:

返回值類型 operator 運算符(形參表)
{
    ...
}

下麵舉個例子,實現對複數對象的 +- 運算符重載:

class Complex // 複數類
{
public:
    // 構造函數,如果不傳參數,預設把實部和虛部初始化為0
    Complex(double r = 0.0, double i = 0.0):m_real(r),m_imag(i) {  }

    // 重載-號運算符,屬於成員函數
    Complex operator-(const Complex & c)
    {
        // 返回一個臨時對象
        return Complex(m_real - c.m_real, m_imag - c.m_imag);
    }

    // 列印複數
    void PrintComplex()
    {
        cout << m_real << "," << m_imag << endl;
    }
    
    // 將重載+號的普通函數,定義成友元函數
    // 目的是為了友元函數能訪問對象的私有成員
    friend Complex operator+(const Complex &a, const Complex &b);
    
private:
    double m_real;  // 實部的值
    double m_imag;  // 虛部的值
};

// 重載+號運算符,屬於普通函數,不是對象的成員函數
Complex operator+(const Complex &a, const Complex &b)
{
    // 返回一個臨時對象
    return Complex(a.m_real + b.m_real, a.m_imag + b.m_imag);
}

int main() 
{
    Complex a(2,2);
    Complex b(1,1);
    Complex c;

    c = a + b; // 等價於c = operator+(a,b)
    c.PrintComplex();

    c = a - b; // 等價於 c = a.operator-(b)
    c.PrintComplex();

    return 0;
}

輸出結果:

3,3
1,1

從上面的例子中,我們可以知道重載為成員函數和普通函數的區別了:

  • 重載為成員函數時,參數個數為運算符目數減一。如:c = a - b; 等價於 c = a.operator-(b)
  • 重載為普通函數時,參數個數為運算符目數。如:c = a + b; 等價於c = operator+(a,b)

在上面的代碼中,我把重載 + 號運算符的普通函數,在Complex複數類中定義成了友元函數,目的是為了友元函數能訪問對象的私有成員,否則會編譯報錯。


03 +號和-號重載函數的返回值和參數表

這裡還有個值得思考的問題:

  • 為什麼重載-號和+號運算符函數的返回類型是Complex對象而不是Complex &呢?
  • 為什麼重載-號和+號的運算符函數的參數表是const Complex & c常引用類型而不是Complex c呢?
// 重載-號運算符,屬於成員函數
Complex Complex::operator-(const Complex & c)
{
    // 返回一個臨時對象
    return Complex(m_real - c.m_real, m_imag - c.m_imag);
}

首先先說一下參數表為什麼是const Complex & c常引用類型,首先如果參數表如果普通的對象形式Complex c,那麼在入參的時候,就會調用預設的賦值(拷貝)構造函數,產生了一個臨時對象,這會增大開銷,所以就採用引用的方式,同時又為了防止引用的對象被修改,所以就定義成了const Complex & c常引用類型。

再來說一下返回值為什麼是普通Complex對象,因為本次 - 號和 + 號運算符的函數執行之後,需要返回一個新的對象給到左值。


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

-Advertisement-
Play Games
更多相關文章
  • 最近開始使用IDEA,突然發現的比較的實用的幾個快捷鍵 這些快捷鍵用的好的話真的可以提升很多效率 還有一些比較簡單的快捷鍵,相信大家都會 Ctrl+X:剪切 Ctrl+C:複製 Ctrl+V:粘貼 Ctrl+Shift+上下箭頭:註意它和圖片裡面移動代碼快捷鍵相識,自己體會 ...
  • 有興趣的可以看看註釋裡面的題目要求,自己寫寫或者看看下麵的用別的方式完成目標。 ...
  • 基礎入門知識(一) 一、java技術的分類 java按照技術標準和應用場景的不同分為三類,分別是JAVASE、JAVAEE、JAVAME JAVASE : 平臺標準版,用於開發部署桌面,伺服器以及嵌入式設備和實時環境中的java程式。 JAVAEE : 平臺企業版,開發便於組轉,可擴展,健壯,安全的 ...
  • 新聞 "擁抱可空引用類型" "介紹Orleans 3.0" 視頻及幻燈片 "組合的力量" "關於.NET:探索新的用於.NET的Azure .NET SDK" ".NET設計審查:GitHub快速審查" FableConf 2019 "OSS的樂趣" "走進編譯器與工具之旅" "使用響應式MVU釋放 ...
  • Spring Cloud Config為分散式系統提供了配置伺服器和配置客戶端,可以管理集群中的配置文件。 使用Git、SVN等版本管理系統存放配置文件,配置伺服器會到版本管理系統獲取配置,集群中的配置客戶端再到配置伺服器中獲取配置。 ...
  • [TOC] 1. 概述 本來是不想寫Paramiko的,因為我覺得之前的一篇關於Netmiko模塊更適合網工,後來發現paramiko有包含SFTP功能,所以還是有必要來講講,畢竟我們在設備上是要經常下載配置、上傳版本/升級版本用的,而且SFTP比FTP、TFTP更安全。 所以, 你也不用藉助其他工 ...
  • 01 實現自定義的可變長數組類型 假設我們要實現一個會自動擴展的數組,要實現什麼函數呢?先從下麵的main函數給出的實現,看看有什麼函數是需要我們實現的。 輸出結果: 要實現的方式,要做哪些事情呢?我先列一下: 要用動態分配的記憶體來存放數組元素,需要一個指針成員變數 重載賦值=運算符 重載[]運算符 ...
  • 01 賦值運算符重載的需求 有時候希望賦值運算符兩邊的類型可以不匹配,比如:把一個 int 類型變數賦值給一個Complex(複數)對象,或把一個 char 類型的字元串賦值給一個字元串對象,此時就需要重載賦值運算符‘=’。 需要註意的是:賦值運算符 只能重載為成員函數。 02 賦值運算符重載的例子 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...