运算符重载给c++提供了很强大的功能,使得我们可以将一个类设计得跟内置类型差不多了。
但是运算符这种东西最大的问题就是,看起来直观,却常常隐匿了实际的函数调用过程,时常容易让人困惑。所以在google c++编码规范里面,建议直接用普通的成员
函数而不是重载运算符。
可以看下面的代码段:
class Array { public: int size() const; float& operator[] (int index); // ... }; int main() { Array a; for (int i = 0; i < a.size(); ++i) a[i] = 7; // This line invokes Array::operator[](int) // ... }
注释的那一行显得及其简洁,但实际涉及到两个函数调用operator[] 和operator=,关键是若是不看类Array的定义,你可能很难知道a[i]返回的是个什么东西:C++支持运算符重载!
还有就是赋值运算符,这是每个类所避不开的成员函数,即使不定义也会默认生成。所以一定要记住编译器默认生成的赋值运算符的函数原型(输入参数类型,返回类型):
class A { public: A& operator=(const A&a); A& operator=(A&& a); }
其中第二个是c++11有了右值引用之后新加的。
总之,一个务必小心的原则是:每次看到运算符,把它展开成函数!