C++运算符的重载

运算符包含有很多,但在预定义时很多运算符只能完成单一的运算任务,运算符的重载就是为了扩展运算符的作用范围,使他完成一些我们想让他完成的任务,所以我们需要对其进行重载操作,比如“+”,我们想让其完成两个对象的+ 操作, 在原有预定义的基础就已经做不到,因此我们需要重新对其进行定义,完成两个对象的+操作。

并不是所有的运算符都能重载,能够完成重载的运算符有:+ - * / % ^ & | ~ ! = < > += -= = /= %= ^= &= |= << >> <<= >>= == != <= >= && || ++ – , -> -> () [] new new[] delete delete[],除了要知道有这些运算符可以进行重载操作外,还需要知道这些运算符是几目运算符,具体目的会在后面叙述。

运算符重载的实质说白了就是函数的重载,可以重载为成员函数,也可以重载为普通函数,具体形式:

返回值类型 operator 运算符(形参表)
{
……
}

实例:

class Complex 
{
public:
double real,imag; 
Complex( double r = 0.0, double i= 0.0 ):real(r),imag(i) { }
Complex operator-(const Complex & c); // 对减号进行重载
};
Complex operator+( const Complex & a, const Complex & b)//对加号进行重载
{
return Complex( a.real+b.real,a.imag+b.imag); //返回一个临时对象
} 
Complex Complex::operator-(const Complex & c)
{
return Complex(real - c.real, imag - c.imag); //返回一个临时对象
}
int main()
{
Complex a(4,4),b(1,1),c;
c = a + b; //等价于c=operator+(a,b);
cout << c.real << "," << c.imag << endl;
cout << (a-b).real << "," << (a-b).imag << endl;
//a-b等价于a.operator-(b)
return 0;
}

上述代码完成了“+”“-”的重载操作,使能够完成两个复数类对象的加减操作,在对重载的运算符进行调用的时候等价于对重载函数调用,所以在主函数有一种等价形式,可以看到是用了函数调用的格式来写的。
细心的朋友可以发现,在上面两个重载函数的形参表中,个数不同,但是加减运算符都是双目运算符,这时候就要来说明上面一个遗留的问题了。加减运算符都是双目运算符为什么重载时的形参表中形参的个数却不同呢,可以看到在上面函数的声明时,减号的重载函数我们重载为了类的成员函数,而加号的重载函数我们重载为了一个普通函数,所以,当我们将一个运算符重载类的成员函数时,形参表中的参数个数实际上是比运算符的目数少一个的,另一个参数是隐含,比如上面代码中写到的,a-b等价于a.operator-(b),其中“-”被我们重载为了成员函数,因此在用的过程中,只有b一个参数,另一个隐含的参数自然就是a。而重载为普通函数时,形参个数就是运算符的目数,但是这时又出现了一个问题,当我们重载为普通函数时,重载的运算符便不能够访问类的私有成员,所以我们一般又将运算符重载为友元函数。一般情况下,我们都会将重载为类的成员函数。

一些在运算符的重载时需要注意的问题:

1、重载不能改变运算符的优先级和结合性。
比如说加减乘除中,重载后运算的优先性依旧和之前相同,即乘除优先级高于加减。

2、以下运算符不能被重载:“.”、“.*”、“::”、“?:”

3、箭头运算符->、下标运算符[ ]、函数调用运算符( )、赋值运算符=只能以成员函数的形式重载。
因此在重载时,其形参个数是运算符目数减一

4、类型强制转换运算符也可以重载,类型强制转换运算符被重载时不能写返回值类型,实际上其返回值类型就是该类型强制转换运算符代表的类型。
如operator double () { …} ,operator float() { …}
可以看到重载函数前没有返回值类型,但是可以知道第一个返回的值就是double类型,而第二个就是float类型

5、自增自减运算符的重载。
自增自减的运算因为有前置和后置之分,但是直接写出来“++”,“–”我们并不能区分重载的是前置还是后置,因此在c++中规定:
前置运算符作为一元运算符重载
例如:
重载为成员函数:
T & operator++();
T & operator–();
重载为全局函数:
T1 & operator++(T2);
T1 & operator—(T2);
后置运算符作为二元运算符重载,多写一个没用的参数:
重载为成员函数:
T operator++(int);
T operator–(int);
重载为全局函数:
T1 operator++(T2,int );
T1 operator—( T2,int);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值