第11章 使用类
内容 运算符重载 友元函数 重载<<
一些建议 不要害怕错误 更全面了解C++的机制 不要觉得必须使用所有特性,不要在第一次学习时就试图使用所有特性
1. 运算符重载 目的:美化操作,更符合人的思维,更抽象 做法:重载操作符 数组的加法 其它 for (int i = 0; i < 20; i++) evening[i] = sam[i] + janet[i]; // add element by element evening = sam + janet; // add two array objects 其它
运算符重载格式 C++内部表达 operator op(argument-list) district2 = sid + sara; // + [] @ C++内部表达 district2 = sid + sara; // district2 = sid.operator+(sara);
2. 计算时间:一个运算符重载示例 时间的加法 Time Sum(const Time& t)const; total = coding.Sum(fixing); 示例20
2.1 添加加法运算符 重载+ Time operator+(const Time & t)const; total = coding+fixed; 示例21
2.2 重载限制 多数C++运算符(表11.1)可以重载 要求 要求至少一个操作数是用户自定义 不改变原有句法规则 不能创建新的运算符 不能重载的运算符…. 只能通过成员函数进行重载
2.3 其他重载运算符 -和* 23
3. 友元 某些特定的情况下,方便访问私有成员。 友元函数 友元类 友元成员函数
例子 A = B*2.75 A = 2.75*B; //最好可以使用 A = B.operator*(2.75); Time operator*(double, const Time &);//非成员函数
3.1 创建友元 将下列语句放在Time 声明中 friend Time operator*(double m, const Time & t); // goes in class declaration operator*不是类里的函数 operator*函数内部可以随意访问Time的私有成员
3.2 常用的友元:重载<<运算符 cout << trip; //非常方便 cout << "Trip time: " << trip << " (Tuesday)\n"; // can do <<是从左到右的
4. 重载运算符:作为成员函数还是非成员函数 operator+ 成员函数 非成员函数 两者都可以,只能选其中一个 Time operator+(const Time & t) const; 非成员函数 friend Time operator+(const Time & t1, const Time & t2); 两者都可以,只能选其中一个
5. 再谈重载:一个矢量类 表示 分量(直角坐标系) 长度和方向(极坐标) 运算 示例5
5.1 使用状态成员 mode,控制不同的表示方式
5.2 为vector类重载算术运算符 + 返回局部变量 返回构造函数 *
5.3 对实现的说明 有些信息 作为成员,可以提前计算好,返回成员 不作为成员,返回时临时计算
5.4 使用vector类来模拟随机漫步 醉鬼走路问题 随机走动 距离原始位置不超过给定长度 随机生成角度,长度是输入的
6. 类的自动转换和强制类型转换 用构造函数来转换 用于转换的构造函数只能有一个参数 explicit关闭隐式转换
6.1 转换函数 把对象转成别的类型 operator int(); 谨慎地使用隐式转换函数
6.2 转换函数和友元函数 重载运算有两种方式
7. 总结