HOWTO · C++

在 C++ 中過載 == 運算子

這是在 C++ 中實現 == 運算子過載的程式設計教程。

本文將討論運算子過載的基礎知識,並提供類中 == 運算子的簡單實現。

C++ 中的運算子過載

運算子過載是指更改運算子在與使用者定義的資料型別(如類物件和結構)一起使用時的行為方式。這些類似於呼叫該運算子的類中的成員函式。

例如,如果我們有一個 Student 類,並且我們想檢查哪些學生的分數高於另一個,那麼我們可以過載 > 運算子,該運算子可以比較兩個物件的 marks 資料成員,並且返回結果。

運算子過載的語法如下:

class className {
 public:
  returnType operator operatorSymbol([list of arguments]) {
    // definition
  }
};

注意 operator 是用於運算子過載的關鍵字,之後我們指定需要過載的運算子的符號。請記住,對於 int、char、float 等基本資料型別,我們不能過載運算子。

除了少數不允許過載的運算子外,幾乎所有運算子都可以過載。這些運算子包括:

  • sizeof 運算子
  • typeid 運算子
  • 範圍解析 (::)
  • 類成員訪問運算子 (.(dot), .*(指向成員運算子的指標)
  • 條件運算子 (?:)

在 C++ 中過載 == 運算子

== 也是 equal to 運算子,屬於比較運算子分類並返回 truefalse 的布林結果。判斷運算子左右兩側的兩個運算元是否相等。

對於類等使用者定義的資料型別,可以過載該運算子來比較一個類的兩個物件,以檢查兩個物件的所有資料成員是否相等。

考慮一個具有以下資料成員的類 Employee

class Employee {
 private:
  string name;
  int salary;
};

在這個類中,我們可以過載 == 運算子來檢查兩個員工的物件是否相等。這個函式可以實現為:

bool operator==(const Employee &emp) {
  if (name == emp.name && salary == emp.salary) return true;
  return false;
}

現在,我們可以把它們放在一起來組成一個完整的類。

#include <iostream>
#include <string>
using namespace std;

class Employee {
 private:
  string name;
  int salary;

 public:
  Employee(string n, int s) {
    name = n;
    salary = s;
  }
  bool operator==(const Employee &emp) {
    if (name == emp.name && salary == emp.salary) return true;
    return false;
  }
};
int main() {
  Employee e1("David", 1000);
  Employee e2("David", 1000);
  if (e1 == e2)
    cout << "Equal" << endl;
  else
    cout << "Not Equal" << endl;
}

輸出:

Equal

在類層次結構中過載 == 運算子

如果你有多個類,有些類是父類,有些是子類,那麼你需要在所有的子類和超類中實現操作符函式。例如,如果有一個類 A 並且你實現 == 運算子,則此過載運算子將可用於其所有子類。

class A {
 public:
  int foo;
  bool operator==(const A &a) { return foo == a.foo; }
};

現在,我們有另一個類 B,它是 A 的子類。

class B : public A {
 public:
  int bar;
};

如果我們沒有在這個類中實現 == 運算子,那麼它會呼叫基類的運算子函式,但問題是基類只比較自己的資料成員,而不是 B 類。因此,我們還需要在子類中實現操作符。

在該實現之後,在我們顯式呼叫它之前不會呼叫基類實現。因此,我們顯式呼叫該函式來比較基類的資料成員。

這在下面的程式碼片段中得到了證明:

class B : public A {
 public:
  int bar;
  bool operator==(const B &b) {
    if (!A::operator==(static_cast<const A &>(b))) {
      return false;
    }
    return bar == b.bar;
  }
};

驅動函式將是:

int main() {
  B b;
  b.bar = 2;
  b.foo = 1;
  B b2;
  b2.bar = 2;
  b2.foo = 1;
  if (b == b2) {
    cout << "Equal" << endl;
  }
}

輸出:

Equal