运算符重载
运算符函数格式:
operator op(argument-list)
op必须是有效的C++运算符。
重载限制:
- 重载后的运算符必须至少有一个操作数是用户定义的类型。
- ‘=’、‘()’、‘[ ] ’、‘->’只能通过成员函数重载。
友元
通过友元可以访问类对象私有部分的访问,三种友元:
- 友元函数
- 友元类
- 友元成员函数
友元函数
将原型放在类声明中,并在原型声明前加关键字friend:
friend Time operator*(double m, const Time & t);
说明:
- 不是成员函数,不能用成员运算符调用。
- 与成员函数的访问权限相同。
编写函数定义,不要在定义中使用关键字friend。
友元类
friend class Remote;
使得Remote成为A的友元类。
友元声明可以位于类中的任何位置。
友元类所有的部分都能影响A类对象的私有数据。
友元成员函数
在Tv类中声明一个友元成员函数,只有这个函数可以影响Tv类对象的私有数据:
class Tv
{
friend void Remote::set_chan(Tv &t, int c);//将Remote::set_chan()成为Tv类的友元。
...
};
需要使用前向声明:
在Remote定义前面插入:class Tv;
类的自动转换和强制类型转换
类的自动转换
在C++中,接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了蓝图。
只有接受一个参数的构造函数才能作为转换函数;当有两个参数时,其中有一个参数提供默认值也可以。构造函数只用于从某种类型到类类型的转化。
C++新增了关键字explicit,可以关闭这种自动特性,构造函数声明如下:
explicit Stonewt(double lbs);//不允许隐式转换
//可以进行强制类型转换
Stonewt myCat;
myCat = 19.6;//不允许,这是隐式转换
mycat = Stonewt(19.6);//可以
转换函数
将类类型转换到某种类型,是用户定义的强制类型转换。
转换函数:operator typeName();
typeName指出要转换成的类型。
注意:
- 转换函数必须是类方法,意味着需要通过类对象来调用;
- 转换函数不能指定返回类型,因为有了要转换成的类型;
- 转换函数不能有参数