2020年8月20日
第十一章 使用类
运算符重载
友元函数
重载<<运算符,以便用于输出
状态成员
使用rand()生成随机值
类的自动转换和强制类型转换
类转换函数
1.“轻松地使用这种语言。不要觉得必须使用所有地特性,不要在第一次学习时就试图使用所有的特性。”
2.运算符重载:
是一种形式的C++多态
运算符函数:operator op(argument-list)
Time operator+(const Time&t)const;
Time Time::operator+(const Time&t)const
{
Time sum;
sum.minutes=minutes+t.minutes;
sum.hours=hours+t.hours+sum.minutes/60;
sum.minutes%=60;
return sum;
}
total=coding.operator+(fixing);
total=coding+fixing;
t4=t1+t2+t3;也是合法的
t4=t1.operator+(t2+t3);
t4=t1.operator+(t2.operator+(t3));
重载限制:
3.不能创建新运算符,例如,不能定义operator**函数来表示求幂。
可重载的运算符
3.友元(友元函数,友元类,友元成员函数)
友元函数:通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。创建友元函数的第一步是将其原型放在类声明之中,并在原型声明前加上关键字friend
虽然友元函数是在类声明中声明的,但它不是成员函数,因此不能使用成员运算符来调用。
虽然不是成员函数,但它与成员函数的访问权限相同。
它不是成员函数,不需要类限定符,不需要在定义中使用关键字friend
友元函数是类的扩展接口的组成部分。
4.<<的第一种重载版本
如果使用一个Time成员函数来重载<<,Time对象将是第一个操作数:trip<<cout;
但是通过友元函数,可以像下面这样重载运算符
void operator<<(ostream&os,const Time &t)
{
os<<t.hours<<" hours, "<<t.minutes<<" minutes";
}
这样就可以使用cout<<trip;
函数将ostream对象作为一个整体使用,没有直接访问ostream对象的私有成员,所以并不一定是ostream类的友元,这就意味着不必修订ostream的定义。
5.<<的第二种重载版本
cout<<x<<y;
ostream&operator<<(ostream&os,const Time&t)
{
os<<t.hours<<" hours,"<<t.minutes<<" minutes";
return os;
}
6.对于某些运算符来说,成员函数是唯一合法的选择。在其他情况下。两种格式没有太大区别,有时,根据类设计,使用非成员函数版本可能更好。
7.类的自动转换和强制类型转换