运算符的澄清

3

我一直在阅读关于类操作符的内容,看到了以下示例:

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个回答

3

这是否意味着我可以用任何我想要的符号代替 [ 和 ]?

不是所有运算符都可以重载

例如,我能使用括号吗?

你可以,但你不应该这样做。

此外,在 int& operator[] 中,& 的意义是什么?

它意味着你正在返回一个指向 int 变量的引用

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

两者之间没有区别。


我明白了。当我的对象被复制时,我该如何定义“=”运算符的行为? - Maxpm
1
@Maxpm:阅读这个这个 - Prasoon Saurav

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

1

虽然你可以根据自己的喜好定义运算符,但括号可能会成为一个问题。原因是与类构造函数冲突!Array(25)是什么意思?我不确定这是否被允许(尽管我相信其他人会知道),但重点是即使你被允许这样做,你也会遇到问题。

一般来说,用作运算符的符号可以被重载/重新定义。你可以指定如何为你的类工作的==、&、>和[]。你不能决定字母“q”现在意味着某种类型的比较。至于()问题,我不确定。

引用标记&对于索引是必要的,因为你希望在返回的地址上进行潜在的赋值,而不仅仅是得到一个值。如果你允许宽松的描述,那么“大多数”运算符都不需要这个。


1
你可以使用括号,因为这里也有一个


operator()

一些库(例如boost::blas)可以做到这一点。但是:您不能编造新的括号,因为没有operator{}operator<>

关于您的语法问题:我没有尝试过,但不认为可以,因为operator[]是一个函数名,您不应该在函数名中添加空格。


1

1) 在C++中,可“重载”的运算符集合是固定的。
请参考维基百科上的这个表格:
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Table
每个表格中都有一个“可重载”列。

2) int&表示你正在返回值的引用。
C++中的引用类似于指针,并值得单独讨论。但在这个操作符的情况下,它允许你将此操作符用作赋值语句的左操作数,例如:

x[3] = 0;

如果它只返回一个整数,那么这是行不通的;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接