The Usage of Class
1. Operator Overloading
1.1 Overloading
- Function overloading: 具有同一个函数名但是不同参数列表的函数
- Operator overloading
operatorop(argument list)
(e.g.operator+()
,operator*()
,opretor[]()
)- 重载了
+
运算符后,a+b
等同于a.operator+(b)
, 并且可以用于连加a+b+c
等同于a.operator+(b.operator(c))
- 限制
- 参与运算的对象至少有一个是用户自定义的类
- 不能破坏原有的运算符的语法规则
- 不能更改运算符的优先级
- 不能创造一个新的运算符
- 只能用成员函数重载运算符
2. Friend
为什么需要友元:以数乘为例,当A = 2.75 * B
时,double
类并不能访问重载的乘法运算。
- 定义: 不是成员函数,不需要使用类的限定域;不使用friend关键词做限定
- 常用的友元重载运算符:
<<
- 第一种重载方式,无法解决连续输出
cout << time << endl;
- 第二种重载方式
- 参数ostream必须是引用
- 第一种重载方式,无法解决连续输出
// 第一种重载
void operator<<(ostream &os,const Time &t){
os << t.hour << ":" << t.minutes;
}
// 第二种重载
ostream &operator<<(ostream &os,const Time &t){
os << t.hour << ":" << t.minutes;
return os;
}
3. Type change
- 两个标准类型: 如果兼容自动转换
float a = 11
,不兼容则不可行int *p = 10 // 错误
,但可以强制转换int *p = (int *) 10
- 类和标准类型或其他类: 只有接受一个参数(或其他参数有默认值)的构造函数才可以进行隐式的转换
Stonewt(int stn); Stonewt s; s = 10;
, 关键词explicit
关闭这种特性,但可以使用强制转换s = (Stonewt)10;s = Stonewt(10);
- 反向转换(标准类型->类): 显示
int x = int(s);int x = (int)s;
; 隐示: 使用转换函数, 加explicit
后强制显示 - 转换函数:
operator typeName()
- 类方法
- 无返回类型,但是在实现时会返回值
- 无参数