我一直在读类操作符,并且遇到了以下示例:
class Array {
public:
int& operator[] (unsigned i) { if (i > 99) error(); return data[i]; }
private:
int data[100];
};
这是否意味着我可以用我想要的任何内容替换[
和]
?例如,我可以使用括号吗?
另外,int& operator[]
中&符号的重要性是什么?
稍微不那么重要的一点,使用int& operator []
代替int& operator[]
语法是否正确?
答案 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;
,这将不起作用