[13.3] 有什么运算符重载的实例?
[Recently changed so it uses the std:: syntax (on 7/00). Click here to go to the next FAQ in the "chain" of recent changes.]
这里有一些运算符重载的实例:
- myString + yourString 可以连接两个 std::string 对象
- myDate++ 可以增加一个 Date 对象
- a * b 可以将两个 Number 对象相乘
- a[i] 可以访问 Array 对象的某个元素
- x = *p 可以反引用一个实际“指向”一个磁盘记录的 "smart pointer" —— 它实际上在磁盘上定位到 p 所指向的记录并返回给x。
[13.5] 什么运算符能/不能被重载?
大多数都可以被重载。C的运算符中只有 . 和 ? :(以及sizeof,技术上可以看作一个运算符)。C++增加了一些自己的运算符,除了::和.*,大多数都可以被重载。
这是一个下标 运算符的示例(它返回一个引用)。先没有运算符重载:
[13.7] 我能为“幂”运算创建一个 operator** 吗?
不行。
运算符的名称、优先级、结合性以及元数都是由语言固定的。在C++中没有operator**,因此你不能为类类型创建它。
如果还有疑问,考虑一下x ** y与x * (*y)等同(换句话说,编译器假定 y 是一个指针)。此外,运算符重载只不过是函数调用的语法修饰。虽然这种特殊的语法修饰非常美妙,但它没有增加任何本质的东西。我建议你重载pow(base,exponent)(双精度版本在<cmath>中)。
顺便提一下,operator^可以成为幂运算,只是优先级和结合性是错误的。
如何创建operator^重载呢?
Matrix(const Matrix& m); // 拷贝构造函数
Matrix& operator= (const Matrix& m); // 赋值运算符
[13.9] 为什么Matrix(矩阵)类的接口不应该象数组的数组?
为什么那样写呢?返回引用和返回值的区别?