l 操作符重载
操作符函数的格式:operator op(argument-list)
op必须是有效的C++操作符,不能虚构一个新的符号。
如果district2,sid和salesperson都是类对象,且重载了+操作符。便可以编写这样的等式:
district2=sid+salesperson
编译器会做这个的替换:
district2=sid.operator+(sara);
上式表明是sid调用了方法,并以sara为参数。
l 添加加法操作符
eg:Time operator +(const Time &t) const;
将const关键字放在函数括号的后面含义为函数不修改调用对象。
假设t1,t2,t3均为Time对象,则:t4=t1+t2+t3是允许的。
操作符重载是有限制的
n 重载后的操作符必须至少有一个是用户定义的类型
n 使用操作符时不能违反操作原来的句法规则。如,原来有两个操作数的符号不能重载成只有一个操作数的符号
n 不能定义新的操作符
n 不能重载的操作符有:”sizeof” “.*” “::” “?:” “typeid” “const_cast” “dynamic_cast” “reinterpret_cast” “static_cast”
n 大多数操作符都可以通过成员或非成员函数进行重载,以下操作符只能通过成员函数进行重载
u = () [] ->
l 友元
eg:A,B为类,重载了*操作符
则可写为A=B*2.75
若想写成A=2.75*B,则可以使用非成员函数来重载*操作符,函数原型:
Time operator*(double m,const Time &t);
常规非成员函数不能直接访问类的私有数据,但友元函数可以。
创建函数
n 将原型放在类声明中,并在原型声明前加上关键字friend:
friend Time operator*(double m,const Time &t);
该原型意味着以下两点:
1. 该函数不是成员函数,因此不能使用成员操作符来调用
2. 虽然不是成员函数,但它与成员函数的访问权限相同
n 编写函数定义,因为不是成员函数,所以不用使用Time::限定符,也不要在定义上使用关键字friend
l 成员函数还是非成员函数
重载+操作符
成员函数原型:Time operator+(const Time &t)const;
非成员函数原型:friend Time operator+(const Time &t1,const Time &t2);
非成员版本的重载操作符函数所需的形参数目与操作符使用的操作数数目相同;而成员版本所需的参数数目少一下,因为其中的一个操作数是被隐式地传递的调用对象。
编译器将下面的语句
T1=T2+T3;
转换为下面两个的任何一个:
T1=T2.operator+(T3);//成员函数
T1=operator+(T2,T3);//非成员函数
l 类的自动转换和强制类型转换
将一个标准类型变量的值赋给另一种标准类型的变量时,如果这两种类型兼容,则C++自动将这个值转换为接收变量的类型。
long count=8;
double time=11;
int side=3.33;
这些转换将降低精度。
C++中,接受一个参数的构造函数,可以将标准类型转换为类
因此下面的构造函数
Stonewt(double lbs);
用于将double类型的值转换为Stonewt类型。也就是说,可以编写这样的代码
Stonewt myCat;
myCat=19.6;
程序使用构造函数Stonewt(double lbs)创建一个临时的Stonewt对象,将初始化,然后赋给myCat对象。这一过程称为隐式转换,因为它是自动进行的,而不需要显式强制类型转换。
只有接受一个参数的构造函数才能作为转换函数。将构造函数用作自动类型转换函数似乎是一项不错的特性。最新的C++实现新增了一个关键字(explicit),用来关闭这种自动特性。即explicit Stonewt(double lbs);将关闭隐式转换。但仍然允许显式转换。
显式转换如下
Stonewt myCat;
myCat=Stonewt(19.6);
myCat=(Stonewt)19.6;
构造函数只用于从某种类型到类类型的转换。要进行相反的转换必须使用特殊的C++操作符函数——转换函数
转换函数是用户定义的强制类型转换,可以像使用强制类型转换那样使用它们。
eg:如果定义了Stonewt到double的转换函数,就可以使用下面的转换:
Stonewt wolfe(285.7);
double host=double (wolfe);
double thinker=(double) wolfe;
也可以让编译器来决定如何做:
Stonewt wells(20,3);
double= wells;
创建转换函数:operator typeName();
注意:
n 转换函数必须是类方法
n 转换函数不能指定返回类型
n 转换函数不能有参数
eg:operator double();
operator int();