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

Muhammad Husnain 2023年10月12日
  1. C++ 中的運算子過載
  2. 在 C++ 中過載 == 運算子
  3. 在類層次結構中過載 == 運算子
在 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
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

相關文章 - C++ Operator