原则92:可读性(不仅仅是易用性)应该是使用运算符重载的主要原因。
指导方针11:一个重载运算符的语义对客户应该是自然的、明显的和直观的。
指导方针12:用户自定义类型的重载运算符的语法属性,应该反映已经为基本类型定义了的属性。
原则93:让用户自定义运算符的语法属性模仿预先确定的C++运算符,以避免意外并使它们的使用更可预知。
一些基本运算符属性的总结:
// operators with similar declarations class T { T& operator++(); // ++x --x (prefix) T operator++(int); // x++ x-- (postfix) T* operator&(); // &x (unary) const T* operator&() const; // &x (unary) T& operator=(const T&); // = += -= *= /= %= <<= >>= &= ^= |= }; T operator-(const T&); // - + ~ (unary) int operator!(const T&); // ! (unary) T operator+(const T&, const T&); // + - * / << >> % & ^ | int operator==(const T&, const T&); // == != < <= > >= int operator&&(const T&, const T&); // && || // if the type is pointer-like (i.e., P = T*) class P { T& operator[](int) const; // indexed array access (binary) T& operator*() const; // pointer dereference (unary) }; // if the type is pointer-to-const-like (i.e., PC = const T*) class PC { const T& operator[](int) const; // indexed array access (binary) const T& operator*() const; // pointer dereference (binary) };
原则94:C++语言本身可以作为用户自定义运算符模仿的一个客观和适宜的标准。
原则95:重载运算符中的不一致问题,对客户来说可能是明显的、讨厌的和高代价的。
C++要求下列运算符是成员:
= 赋值
[] 下标
-> 类成员访问
() 函数调用
(T) 转换("cast")运算符
new (静态)分配运算符
delete (静态)删除运算符