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 運算子,屬於比較運算子分類並返回 true 或 false 的布林結果。判斷運算子左右兩側的兩個運算元是否相等。
對於類等使用者定義的資料型別,可以過載該運算子來比較一個類的兩個物件,以檢查兩個物件的所有資料成員是否相等。
考慮一個具有以下資料成員的類 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