《C++PP》学习笔记9第十一章使用类

154 阅读2分钟

运算重载符

将类的sum()替换成operator+()

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 + fixingl;

重载限制

(1)重载后的运算符必须至少有一个操作数是用户定义的类型。

(2)使用运算符不能违法运算符原来的句法规则。

(3)不能创建新运算符。

(4)不能重载下面的运算符:sizeof/"."/".*"/"::"/"?:"/typeid/const_cast/dynamic_cast/reinterpret_cast/static_cast

(5)可以重载:

"="/"( )"/"[ ]"/"->"

友元

通过让函数称为友元,可以赋予该函数与类的成员函数相同的访问权限。

在类声明中函数前面加上friend

friend Time operator *(double m ,const Time & t);

在定义实现函数功能时不要加friend

重载<<

cout<<trip

void operator<<(ostream &os , const Time & t)
{
os << t.hours << "hours."<<t.minutes << "minutes.";
}

该函数是Time的友元,不一定必须是ostream的友元

但是不能实现下列语句

cout << "Trip time:" << trip << "Tuesday\n";

<<要求"<<"左边是cout对象,所以到trip后面就输出不了报错

ostream & operator<<(ostream & os,const Time & t)
{
os << t.hours << "hours," << t.minutes << "minutes.";
}

注意:普通函数的类外定义需要使用限定符,例如Time::,友元函数不用

重载运算符作为非成员函数所需的形参数目与运算符使用的操作数一样,成员版本所需的参数数目少一个,其中一个是隐式地传递地调用对象。

强制类型转换

只有接受一个参数的构造函数才能作为转换函数

加上关键字explicit阻止自动类型转换

Stonewt myCat;
mycat = 19.6;//不合法
mycat = Stonewt(19.6);//合法

转换函数

operator typeName();

需要注意:

(1)转换函数必须是类方法

(2)转换函数不能指定返回类型

(3)转换函数不能有参数

Stonewt::operator int() const
{
return int (pounds + 0.5);
}

重载+

A = B + C;

如果B是对象,则重载+符可以是成员函数也可以是友元函数,如果B不是对象,则重载+必须是友元函数。