7.1运算符重载的规则
首先,c+编译器对已有的类型如整数,单精度,双精度等加法减等都有重载,在运行时都会不知觉的使用。但对于一些新定义类型,用户可以通过运算符重载来按照用户意图进行运算。程序员常常用运算符重载来做数学类模仿运算符的惯用的用法,例如复数,向量等。所以用于类运算的运算符通常都要进行重载。但有两个运算符系统提供默认重载版本:
1、赋值运算符“=”,系统默认重载为对象数据成员的复制
2、地址运算符“&”,系统默认重载为返回任何对象的地址
可重载的运算符:不能创建新的运算符,只有系统预定义运算符才能被重载
. .* :: ?: sizeof (其余的运算符大部分都可以重载)
重载运算符基本语义不变:
1、不改变运算符的优先级;
2、不改变运算符的结合性
3、不改变运算符所需要的操作数的个数
结合性和优先级体现在重载运算符的使用上,而操作数的个数则体现在重载运算符的使用和重载函数定义是的参数设定上。
运算符重载的语法:
类型 类名::operator op(参数表)
{ //相对该定义的操作 }
其中,类型是函数返回类型。类名是要重载该运算符的类。“op”表示要冲在的运算符。函数名是operator op,由关键字operator和被重载的运算符op组成,参数列表列出运算符所需要的操作数。
重载运算符的方式(成员函数,友元函数,普通函数)和调用的本质:
AopB:
成员函数:A.operator op(B);
友元函数:operator op(A,B);
使用普通函数重载访问private和protected数据成员时,必须通过public接口提供的数据实现,会增加开销。所以一般使用成员函数和友元函数。友元函数和成员函数的区别在于成员函数由this指针,而友元函数没有this指针。所以对于n元运算符,其重载函数使用成员函数的时候形参会减少一个参数(this指针),调用的时候另外那个参数会通过this指针来指向。
返回类型需注意:
1、不要返回局部变量的引用
//重载函数:
TriCoor TriCoor::operator+(TriCoor t)
{TriCoor temp;
temp.x=x+t.x;
temp.y=y+t.y;
temp.z=z+t.z;
return temp;}
如果函数返回值类型改为引用,程序就崩了。首先清楚,函数运行完成后,返回temp,并生成匿名对象,将temp中的数据拷贝到匿名对象中,析构临时变量temp。所以temp时不存在的那时,引用一定是要有谁的引用,temp不存在了,所以程序会崩。
2、如果在成员函数中想要返回对象的本身,可以使用return *this;
如:
TriCoor TriCoor::operator++() //成员函数
{x++;
y++;
z++;
return *this;}//谁调用,this就指向谁
3、常见的函数返回类型
重载“+”运算符和返回类类型TriCoor,重载“++”和“=”运算符函数返回类类型的引用TriCoor&