操作符重载、友元函数、类的强制转换
1.将某个函数改为重载操作符的函数只要将函数名替换为operator+()即可
如:Time Sum(const Time & t)const
改为Time operator+(const Time & t)const
调用时可以如 total = coding.operator+(fixing); //coding是Time类的一个对象
也可以调用如: total = coding+fixing;
两种方法都将调用operator+()方法,其中,操作符左侧的对象时调用对象,右侧的对象时作为参数被传递的对象。
因此t4 = t1 + t2 + t3 会被转化为 t4= t1.operator+(t2.operator+(t3)};
当被重载的操作符为非成员重载操作符时,应使用非成员函数进行重载,例如:
A = 2.75*B //此种由于2.75为double,因此不是类成员,从而不能用成员函数重载后的操作符进行调用。
它与下面的非成员函数调用匹配:
A= operator*(2.75,B); //等价于Time operator *(double m,const Time & t);
非成员函数重载时,操作符表达式左边的操作数对应于操作符函数的第一个参数,操作符表达式右边的操作数对应第二个参数。
2.非成员函数访问类的私有成员时可以借助友元,即能访问类的私有成员的非成员函数叫做友元函数。
友元函数声明中带friend但定义中不带,且友元函数前不能加类的限定符,因为是非成员函数
3.一种<<操作符的重载(使用cout<<...直接输出对象内容)
(1) void operator<<(ostream &os,const Time &t) //Time类有两个成员变量hours和minutes
{
os<<t.hours<<"hours."<<t.minutes<<"minutes";
}
(2)为了支持操作cout<<A<<B; 这种连续输出,左侧表达式(cout<<A)应返回一个ostream类型对象以此来调用下一次的输出操作。此时由于程序传入的参数是一个对象的引用,因此返回参数时应返回该对象的引用,即返回为ostream &型。如下:
ostream & operator<<(ostream &os,const Time &t)
{
os<<...;
return os; //该种重载还可以用于文件fou<<的重载(直接输出某文件)
}
4.只接受一个参数的构造函数可以用于将参数转换为类类型,这种是种隐式转换,如:
定义时:Stonewt::Stonewt(double lbs)
{
stone = int(lbs) / x; //对double进行操作,构造函数返回Stonewt的类类型
...
}
调用时:
Stonewt myCat;
myCat =19.6; //隐式转换
如果在定义时使用关键字explicit,可以避免这种隐式转换,如: explicit Stonewt(double lbs);
在用explicit限定完之后,如果想调用转换,则只能对它进行限制调用,如mycat=(Stonewt)19.6; //强制转换属于显示调用
5.如果希望将类转化为已有类型,如int或double,需要创建转换函数,比如要转换为typeName类型,则要用如下形式:
operator typename();
比如讲某个类转化为Int型,则要将如下语句添加到类中:
class Stonewt
{
...
operator int(); //也可以在后面加上const 限定符修饰
}
调用时直接 cout<<int(poppins)<<endl; //此时假定poppins是Stonewt的一个对象