C++ 中的過載下標運算子

Jinku Hu 2021年10月2日
C++ 中的過載下標運算子

本文將演示如何在 C++ 中過載下標/索引運算子。

運算子過載是 C++ 語言的一個強大功能。它為程式設計師提供了為任何使用者定義的類重新定義現有運算子的含義的便利。從本質上講,過載運算子是函式,並且是這樣定義的,只是它們具有特殊的名稱。名稱必須以字首 operator 開頭,後跟正在過載的運算子符號。

通常,運算子過載函式具有與給定運算子的運算元相同數量的引數。因此,我們的下標運算子過載將接受兩個引數。下面的示例程式碼演示了一個 MyClass 類實現,它具有 operator[] 成員函式,該函式對內部 vector 結構進行元素訪問操作並返回對元素的引用。MyClass 基本上是圍繞 std::vector 容器的包裝類,並提供了幾個用於演示的成員函式。

請注意,operator[] 成員函式有一個引數作為通常的下標運算子。但是請注意,當運算子函式被宣告為成員函式時,它的第一個引數繫結到隱式 this 指標。因此,我們可以比宣告為成員函式的運算子過載的運算元少一個引數。

#include <iostream>
#include <string>
#include <vector>

using std::cout; using std::cin;
using std::endl; using std::string;
using std::vector;

template<typename T>
class MyClass {
public:
    MyClass() = default;
    explicit MyClass(const T &data) {
        vec.push_back(data);
    };
    MyClass(std::initializer_list<T> list) {
        vec.insert(vec.end(), list.begin(), list.end());
    };

    void push_back(const T &data) {
        vec.push_back(data);
    };

    void pop_back() {
        vec.pop_back();
    };

    size_t size() {
        return vec.size();
    };

    T &operator[](size_t pos) {
        return vec.at(pos);
    };

    const T &operator[](size_t pos) const {
        return vec.at(pos);
    };

private:
    vector<T> vec;
    string name;
};

int main() {
    MyClass<string> m1 = { "top",
                           "mop",
                           "gop",
                           "sop" };

    for (size_t i = 0; i < m1.size(); ++i) {
        cout << m1[i] << endl;
    }

    cout << "/ ------------------- /" << endl;

    m1.pop_back();
    m1.pop_back();

    for (size_t i = 0; i < m1.size(); ++i) {
        cout << m1[i] << endl;
    }

    return EXIT_SUCCESS;
}

輸出:

top
mop
gop
sop
/ ------------------- /
top
mop

請注意,某些運算子必須作為成員函式過載,其中之一是下標運算子。建議 operator[] 函式具有與內建運算子相似的含義,它根據給定位置檢索元素。下標過載應該返回一個在賦值兩邊使用的引用。定義 operator[] 函式的兩個版本也很重要,一個用於非 const 物件,另一個用於 const 物件,因為當物件本身是 const 限定的,我們不希望返回的引用是可賦值的。

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Operator