第 11 章 使用类
11.1 运算符重载
使用 operator+
等替代函数名即可实现运算符重载。
重载运算符后,原等式 sum = x + y;
将被替换为 sum = x.operator+(y);
。
11.2 计算时间:一个运算符重载示例
不要返回指向局部变量或临时变量的引用,执行完毕后它们将消失,引用将指向不存在的数据。
重载后的运算符至少有一个是用户定义的类型,避免重载标准类型运算符。
重载不能改变原操作数语法规则和优先级,也不能创建新运算符,不是所有运算符都可以被重载。
11.3 友元
将函数成为类的友元,可以赋予该函数与类内的成员函数相同的访问权限。
成员重载运算符函数左侧操作数为调用对象,非成员重载运算符左侧操作数为函数第一个参数。
将函数声明前加上关键字 friend
并放入类声明中即可声明友元函数,友元函数不是类的成员函数,但可以直接访问类成员。
常用的重载 <<
运算符方法为 friend ostream & operator<<(ostream &out, const Obj &obj) { out << ...; return out; }
。
11.4 重载运算符:作为成员函数还是非成员函数
对于某些运算符来说,成员函数是唯一的选择,有时使用非成员函数更好。
11.5 再谈重载:一个矢量类
11.6 类的自动转换和强制类型转换
只有一个参数的构造函数可以作为转换函数,使得对于构造函数 Stone(double x);
来说,Stone s = 12.3;
可以被隐式转换为 Stone
对象。在构造函数前使用关键字 explicit
可以关闭这种特性。
同样也可以用转换函数做相反的转换,在类声明中添加函数原型 operator double() const;
即可,转换函数虽然没有声明返回类型,但必须返回转换后的值。