c++重载写/集操作符[]

c++ overload the [] operator for write/set

本文关键字:操作符 重载 c++      更新时间:2023-10-16

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

我觉得我要疯了。我一定是错过了一些非常简单的东西

据我所知,getset有一个单一的函数,它看起来像这样:

V& operator[](string K);

或:

double &operator[](int n);

现在很好,我们可以得到什么是:

a[HERE] 

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

但是我们怎么得到什么呢?

a[4] = HERE

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;
    }
}

不要将operator[]视为获取或设置的函数,这可能会令人困惑。把它想象成一个普通的函数。实际上,让我们把它重新写成一个普通的函数:

struct X
{
    int arr[10];
    int& getIndex(int idx) { return arr[idx]; }
};
//...
//initialize x of type X
x.getIndex(3) = 42;

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

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

struct X
{
    int arr[10];
    int& operator[](int idx) { return arr[idx]; }
};
并通过调用 得到相同的结果
x[3];

或者

x.operator[](3);