c ++使用[]运算符重载写入/设置

Rya*_*Lee 1 c++ operator-overloading

我做了大量的搜索,发现了大量的示例和教程,但仍然无法弄清楚如何在写入[]运算符时获取值...

我觉得我疯了.我必须错过一些非常简单的事情

据我可以告诉有一个单一的功能getset它看起来是这样的:

V& operator[](string K);
Run Code Online (Sandbox Code Playgroud)

或这个:

double &operator[](int n);
Run Code Online (Sandbox Code Playgroud)

现在好了,我们可以得到的是:

a[HERE] 
Run Code Online (Sandbox Code Playgroud)

因为HERE变成double &operator[](int HERE); 我们可以很容易地使用它

但我们如何得到的是:

a[4] = HERE
Run Code Online (Sandbox Code Playgroud)

C#有两个非常清晰的get和set方法,value关键字表示被分配的对象.

public string this[int key]
{
    get
    {
        if(key == 1)
           return "1!";
        if(key == 2)
           return "2!";
        else
           return "3!";
    }
    set
    {
        if( value == "setting")   //value is a[3] = THIS
           this.isSet = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 8

不要认为是operator[]获取或设置的功能,这可能会令人困惑.将其视为正常功能.实际上,让我们将其重新编写为正常函数:

struct X
{
    int arr[10];
    int& getIndex(int idx) { return arr[idx]; }
};

//...
//initialize x of type X
x.getIndex(3) = 42;
Run Code Online (Sandbox Code Playgroud)

该方法x.getIndex(3)将返回对成员数组中第4个元素的引用idx.因为您通过引用返回,返回值是一个l值并引用该确切元素,因此您可以为其分配一个值,例如42.这将修改成员,x.arr[3]因为该函数返回该特定对象的别名.

现在你可以operator[]像以前一样重写这个

struct X
{
    int arr[10];
    int& operator[](int idx) { return arr[idx]; }
};
Run Code Online (Sandbox Code Playgroud)

并通过调用获得相同的结果

x[3];
Run Code Online (Sandbox Code Playgroud)

甚至

x.operator[](3);
Run Code Online (Sandbox Code Playgroud)

运算符选项只是语法糖.