目录
1.1 const obj 如果调用 non-const member fun会编译出错
1.const
class complex
{
public:
complex (double r = 0, double i = 0): re (r), im (i) { }
complex& operator += (const complex&);
complex& operator -= (const complex&);
complex& operator *= (const complex&);
complex& operator /= (const complex&);
double real () const { return re; }
double imag () const { return im; }
private:
double re, im;
friend complex& __doapl (complex *, const complex&);
friend complex& __doami (complex *, const complex&);
friend complex& __doaml (complex *, const complex&);
};
只有member fun后面可以用 const定义。成员变量后面不可以写const,写在前面。
1.1 const obj 如果调用 non-const member fun会编译出错
经典错误
如果定义时没有写成void print() const{}; 就会报错。因为str是const-obj,不能用non-const member fun调用。
1.2 例子:STD里的操作符重载
来自 TEMPLATE CLASS basic_string的定义。string类的operator[]。
- 用户可能拿[]来改变字符串。如String str[5]="a";由于string的实现机制是共享模式,不可以直接改变内部内容。只能拷贝一份再改变。所以要做cow(copy on write)设计。
- 如果const String str[2];str是const obj,其内部不可以动。所以不必考虑cow。const obj只会调用const fun,所以const fun不必写cow。