1. 程式人生 > >C++的過載操作符(operator)介紹

C++的過載操作符(operator)介紹

本文主要介紹C++中的過載操作符(operator)的相關知識。

1. 概述

1.1 what

operator 是C++的一個關鍵字,它和運算子(如=)一起使用,表示一個運算子過載函式,在理解時可將operator和運算子(如operator=)視為一個函式名。

使用operator過載運算子,是C++擴充套件運算子功能的方法。使用operator擴充套件運算子功能的原因如下:

  • 使過載後的運算子的使用方法與過載前一致
  • 擴充套件運算子的功能只能通過函式的方式實現(實際上,C++中各種“功能”都是由函式實現的)

1.2 why

對於C++提供的所有操作符,通常只支援對於基本資料型別和標準庫中提供的類的操作,而對於使用者自己定義的類,如果想要通過該操作符實現一些基本操作(比如比較大小,判斷是否相等),就需要使用者自己來定義關於這個操作符的具體實現了。

比如,我們要設計一個名為“person”的類,現在要判斷person類的兩個物件p1和p2是否一樣大,我們設計的比較規則是按照其年齡來比較,那麼,在設計person類的時候,就可以通過對操作符“==”進行過載,來使用操作符“==”對物件p1和p2進行比較了(根據前面的分析,實際上比較的內容應該是person類中的資料成員“age”)。

我們上面說的對操作符“==”進行過載,說是“過載”,是由於編譯器在實現操作符“==”功能的時候,已經為我們提供了這個操作符對於一些基本資料型別的操作支援,只不過由於現在該操作符所操作的內容變成了我們自定義的資料型別(如class),而預設情況下,該操作符是不能對我們自定義的class型別進行操作的,所以,就需要我們通過過載該操作符,給出該操作符操作我們自定義的class型別的方法,從而達到使用該操作符對我們自定義的class型別進行運算的目的。

1.3 how

實現一個操作符過載的方式通常分為兩種情況:

  • 將操作符過載實現為類的成員函式;
  • 操作符過載實現為非類的成員函式(即全域性函式)。

1.3.1 將操作符過載實現為類的成員函式

在類體中宣告(定義)需要過載的操作符,宣告方式跟普通的成員函式一樣,只不過操作符過載函式的名字是“關鍵字 operator +以及緊跟其後的一個C++預定義的操作符”,樣式如下(person是我們定義的類):

    bool operator==(const person& ps)
    {
        if (this->age == ps.age)
        {
            return true;
        }
        return false;
    }

示例程式碼(operator_test2.cpp)如下:

#include <iostream>

using namespace std;

class person
{
private:
    int age;
public:
    person(int nAge)
    {
        this->age = nAge;
    }

    bool operator==(const person& ps)
    {
        if (this->age == ps.age)
        {
            return true;
        }
        return false;
    }
};

int main()
{
    person p1(10);
    person p2(10);
    
    if (p1 == p2)
    {
        cout << "p1 is equal with p2." << endl;

    }
    else
    {
        cout << "p1 is not equal with p2." << endl;
    }
    
    return 0;
}

編譯並執行上述程式碼,結果如下:


通過上述結果能夠知道:因為操作符過載函式“operator==”是person類的一個成員函式,所以物件p1、p2都可以呼叫該函式。其中的 if (p1 == p2) 語句,相當於物件p1呼叫函式“operator==”,把物件p2作為一個引數傳遞給該函式,從而實現了兩個物件的比較。

1.3.2 操作符過載實現為非類的成員函式(即全域性函式)

對於全域性過載操作符,代表左運算元的引數必須被顯式指定。

示例程式碼如下:

#include <iostream>

using namespace std;

class person
{
public:
    int age;
};

// 左運算元的型別必須被顯式指定
// 此處指定的型別為person類
bool operator==(person const& p1 ,person const& p2)
{
    if (p1.age == p2.age)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    person p1;
    person p2;
    p1.age = 18;
    p2.age = 18;

    if (p1 == p2)
    {
        cout << "p1 is equal with p2." << endl;
    }
    else
    {
        cout << "p1 is NOT equal with p2." << endl;
    }

    return 0;
}

編譯並執行上述程式碼,結果如下:


1.3.4 操作符過載的方式選擇

可以根據以下因素,確定把一個操作符過載為類的成員函式還是全域性函式:

  • 如果一個過載操作符是類成員,那麼只有當與它一起使用的左運算元是該類的物件時,該操作符才會被呼叫;而如果該操作符的左運算元確定為其他的型別,則操作符必須被過載為全域性函式;
  • C++要求'='、'[]'、'()'、'->'操作符必須被定義為類的成員操作符,把這些操作符通過全域性函式進行過載時會出現編譯錯誤
  • 如果有一個運算元是類型別(如string類),那麼對於對稱操作符(比如==操作符),最好通過全域性函式的方式進行過載。

1.3.5 操作符過載的限制

實現操作符過載時,需要注意:

  • 過載後操作符的運算元至少有一個是使用者定義型別;
  • 不能違反原來運算元的語法規則;
  • 不能建立新的操作符;
  • 不能過載的操作符包括(以空格分隔):sizeof . .* :: ?: RTTI型別運算子
  • =、()、[]、以及 ->操作符只能被類的成員函式過載

1.3.6 操作符過載的詳細用法

  • 賦值運算子的過載函式(operator=),點選此處

相關推薦

C++的過載操作符operator介紹

本文主要介紹C++中的過載操作符(operator)的相關知識。1. 概述1.1 whatoperator 是C++的一個關鍵字,它和運算子(如=)一起使用,表示一個運算子過載函式,在理解時可將operator和運算子(如operator=)視為一個函式名。使用operato

C++過載運算子如何過載運算子

剛學C++的同學都老是聽說什麼運算子過載,好像很高階的樣子,那麼嘿嘿嘿。 現在我們有一個時間類,我們要過載加減乘除運算子,以達到時間類之間的計算就跟數字加減乘除運算一樣。 首先我們先從最簡單的來: 時

C#中如何利用操作符過載和轉換操作符 轉載

操作符過載 有的程式語言允許一個型別定義操作符應該如何操作型別的例項,比如string型別和int型別都過載了(==)和(+)等操作符,當編譯器發現兩個int型別的例項使用+操作符的時候,編譯器會生成把兩個整數加到一起的程式碼。當編譯器發現兩個string型別的例項使用+操作符的時候,編譯器會生成把兩個

C++學習筆記--操作符過載 友元函式 類的繼承 訪問控釋protected

C++ Primer Plus的閱讀大概到這邊也就先暫時告一段落了(因為開學了!!) 然後近期找來了C++ Primer稍微翻了翻覺得確實寫得比Plus要好一些,而且加入了C++11的新特性,但是無論哪本書對於這些最基本的功能應用大抵也是差不多的,所以也沒覺得看的是Plu

C# 詞法分析器詞法分析介紹

art 優化 不一定 clr gen 多個 scan 原理 輸入緩沖 系列導航 (一)詞法分析介紹 (二)輸入緩沖和代碼定位 (三)正則表達式 (四)構造 NFA (五)轉換 DFA (六)構造詞法分析器 (七)總結 雖然文章的標題是詞法分析,但

C++語言學習——操作符重載

換源 fun 並且 img 51cto cal process 基本 alt C++語言學習(八)——操作符重載 一、操作符重載基礎 1、操作符重載的語法 通過operator關鍵字可以定義特殊的函數,operator本質是通過函數重載操作符。 Type operator

C++快速入門---覆蓋方法和過載方法13

C++快速入門---覆蓋方法和過載方法(13)   覆蓋方法(overriding) 覆蓋:在基類裡提供一個通用函式,但在它的某個子類裡需要修改這個方法的實現。 子類覆蓋基類的方法。 修改例題,為我們的Animal新增eat()方法,並在Pig和Turtle中覆蓋。

C++筆記 第九課 函式過載分析---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第九課 函式過載分析(下) 1.過載與指標 下面的函式指標將儲存哪個函式的地址?第一個 函式過載遇上函式指標 將過載函式名賦值給函式指標時 1.根據過載規則挑選與函式指標引

C++筆記 第八課 函式過載分析---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第八課 函式過載分析(上) 1.自然語言中的上下文 你知道下面詞彙中“洗”字的含義嗎? 結論:能和“洗”字搭配的詞彙有很多 “洗”字和不同的詞彙搭配有不同的含義 2.過

過載操作符cin cout 都在這篇文章裡出現了 注意區別

// A code block #include “iostream” using namespace std; class Date { private: int year,month,day; public: Date(int a=0,int b=0,int c=0) { this-&g

過載操作符日期類

#include “iostream” using namespace std; class Date { private: int year,month,day; public: Date(int a=0,int b=0,int c=0) { this->year=a; this-&

c++虛擬函式override過載函式overload的比較

1. 過載函式要求函式有相同的函式名稱,並有不同的引數序列;而虛擬函式則要求完全相同; 2. 過載函式可以是成員函式或友元函式,而虛擬函式只能是成員函式; 3. 過載函式的呼叫是以所傳遞引數的差別作為呼叫不同函式的依據,虛擬函式是根據物件動態型別的不同去呼叫不同

c++學習總結——運算子過載與標準模板庫STL

一、心得總結     運算子過載使得使用者自定義的資料以一種更簡潔的方式工作。例如在做ATM模擬系統時,使用過載“<”來比較時間,可以簡化程式,減少程式碼。另外,我們也可以過載運算子函式,將運算子用於操作自定義的資料型別。過載運算子函式可以對運算子做出新的解釋,即定義使用

C++流插入輸出和流提取輸入運算子的過載

參考:coursera C++程式設計 目錄 流插入運算子過載 問題 自定義過載實現 流提取運算子過載 總結 又有一個問題 流插入運算子過載 問題 1. cout是什麼? 2. 為什麼 <

C++】前置操作符++i和後置操作符i++

 一、自增和自減的基本使用方法 自增的兩種形式:  i++ i 的值作為返回值,i 自增 1; ++i i 自增 1,i 的值作為返回值。 Example: #include <iostream> #include <string&

VS2017的C++開發心得VS的常用專案屬性介紹

這一篇簡單介紹下常用的專案屬性的使用。 首先是配置管理器,在屬性頁的“配置管理器”按鍵開啟: 所有專案建立好了以後都有兩個預設的配置“Debug”和“Release”。 首先這個配置是什麼意思?屬性頁裡面有很多屬性,比如第一個常規分類下: 先看看圖裡標註的幾項

條款2 最好使用C++轉型操作符static_cast、const_cast、dynamic_cast、reinterpret_cast

static_cast基本上與C舊式轉型具有相同的威力與意義,以及相同的限制。例如,你不能將struct轉化為int,或將都變了轉換為pointer。甚至不能移除表示式的常量性,應由const_cast完成。 const_cast完成移除表示式的常量性,而要新增表示式的常量

C++過載操作符之二輸入>>,輸出

#include<iostream> using namespace std; class Rational { private: int numerator; int denom

【演算法筆記】第六章:C++標準模板庫STL介紹

【演算法筆記】第六章:C++標準模板庫(STL)介紹 標籤(空格分隔):【演算法筆記】 第六章:C++標準模板庫(STL)介紹 第六章:C++標準模板庫(STL)介紹 6.1 vector的常見用法詳解

C++精進篇之―函式重定義、過載、重寫、重入

 C++函式重定義、過載、重寫、重入 1. 重寫 (override):        父類與子類之間的多型性。子類重新定義父類中有相同名稱和引數的虛擬函式。        函式重寫的特點: (1)不同的範圍,分別位於基類和派生類中 (2)重寫函式必須有相同的型別,名稱和