C++ c++;重载[]运算符以进行写入/设置
我已经做了很多搜索,找到了大量的示例和教程,但仍然不知道在写入C++ c++;重载[]运算符以进行写入/设置,c++,operator-overloading,C++,Operator Overloading,我已经做了很多搜索,找到了大量的示例和教程,但仍然不知道在写入[]操作符时如何获取值 我觉得我快要疯了。我一定错过了一些很简单的东西 据我所知,get和set只有一个函数,它看起来像这样: V& operator[](string K); 或者这个: double &operator[](int n); 现在很好,我们可以得到: a[HERE] a[4] = HERE 这里的变为double&运算符[](此处为int) 我们可以很容易地使用它 但我们如何才能得到: a
[]
操作符时如何获取值
我觉得我快要疯了。我一定错过了一些很简单的东西
据我所知,get
和set
只有一个函数,它看起来像这样:
V& operator[](string K);
或者这个:
double &operator[](int n);
现在很好,我们可以得到:
a[HERE]
a[4] = HERE
这里的变为double&运算符[](此处为int)代码>
我们可以很容易地使用它
但我们如何才能得到:
a[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;
}
}
不要将操作符[]
视为获取或设置的函数,这可能会让人困惑。将其视为一个正常函数。事实上,让我们把它写成一个普通函数:
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);
运算符选项只是语法上的糖。在返回该值的运算符[]
中,您不会得到返回值赋值的右侧。当您在返回值的类型上重载操作符=
时,您将得到它的右侧。为了说明这一点:a[5]=此处
大致相当于V&ret=a.operator[](5);ret.operator=(此处)代码>那么,a[4]=此处
意味着(直觉上,假设操作符的行为与内置类型一致)“在此处分配给a[4]
”(假设a
不是常量,这里是在某处定义的宏/变量)。关于这件事你有什么问题?可能是我想的地图场景的复制品。如何设置键/值对,如:myMap[key]=value;好的,所以不可能根据值和键在[]重载中进行逻辑运算?@EpiX你是如何得出这个结论的?@LuchianGrigore:他是对的,不是吗?该值未传递给运算符[]
,因此它如何对其进行操作?@LuchianGrigore:因为x[key]计算结果为内存中的某个位置,然后=值将该值分配给内存中的该位置。在x[key]=value@juanchopanza是的,他试图在C++中重用他的C语言习语,但它不会起作用。我只是指他在这个问题下面的评论。他的评论是正确的。在表达式x[key]=value
中,运算符[]
不能基于value
的值进行操作。至少我想不出有什么合理的办法。这并不意味着他不能按照自己的意愿编写代码,只是他不能按照自己想要的方式或习惯的方式编写代码。