对运营商的澄清

时间:2010-11-27 04:34:59

标签: c++ class operators

我一直在读类操作符,并且遇到了以下示例:

class Array {
public:
     int& operator[] (unsigned i) { if (i > 99) error(); return data[i]; }
private:
     int data[100];
};

这是否意味着我可以用我想要的任何内容替换[]?例如,我可以使用括号吗?

另外,int& operator[]中&符号的重要性是什么?


稍微不那么重要的一点,使用int& operator []代替int& operator[]语法是否正确?

5 个答案:

答案 0 :(得分:3)

  

这是否意味着我可以用我想要的任何东西取代[和]?

Nopes!并非所有运营商can be overloaded

  

例如,我可以使用括号吗?

你可以,但你不应该。

  

另外,int& operator[]中&符号的重要性是什么?

这表示您将reference返回到int变量。

  

编辑:在一个稍微不那么重要的注释中,使用int& operator []而不是int& operator[]在语法上是否正确?

两者之间没有区别。

答案 1 :(得分:2)

您正在做的是定义一个包装简单整数数组的Array类。通过重载[]运算符,您可以像访问任何其他数组一样访问数组的每个元素,这里的优点是您正在检查上限以避免缓冲区溢出。 &符号表示您返回对数组元素的引用,它允许您分配值并获取值。在c ++中重载[]运算符时不要忘记const和非const版本:

int& operator[] (conts int a) {...}
int operator[] (conts int a) {...} const

答案 2 :(得分:1)

你可以使用括号,因为还有一个

operator()

和一些库(例如boost :: blas)这样做。但是:您无法组成新的括号,因为没有operator{}operator<>

RE你的语法问题:没试过,但不这么认为,因为operator[]是函数的名称,你不应该在函数名中添加空格。

答案 3 :(得分:1)

虽然您可以根据需要主要定义运算符,但是parens将是一个问题。原因是与类构造函数冲突!数组(25),这是什么意思?我不确定这是否允许(虽然我很确定其他人会知道),但重点是,即使你被允许,你也会遇到问题。

通常 - 作为运算符的符号可以重载/重新定义您可以指定如何==,&amp;,&gt;和[]为你的班级工作。你不能决定字母'q'现在意味着某种类型的比较。至于()问题,我不确定。

参考标记&amp;索引是必要的,因为您希望可能对返回的地址进行赋值,而不仅仅是获取值。如果您允许宽松的描述,那么“大多数”运营商都不会要求这样做。

答案 4 :(得分:1)

1)否则C ++中有一组固定的'可重载'运算符。
请参阅维基百科中的此表:
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Table
每个表中都有一个“可重载”列

2)int&表示您正在返回对该值的引用。
References in C++与指针类似,值得他们自己讨论,但在运算符的情况下,如果你使用这个运算符作为赋值的左手操作数,它允许的是什么。

x[3] = 0;

如果它只返回一个int;

,这将不起作用