现在的位置: 首页 > 综合 > 正文

C++中的运算符重载(一)

2014年08月10日 ⁄ 综合 ⁄ 共 1833字 ⁄ 字号 评论关闭

.1.运算符重载的定义及实例

C++ 中的多态性分为动态多态性和静态多态性,前者由虚函数实现,后者由函数重载和运算符重载实现。静态多态性的优点是函数调用速度快、效率高,缺点是编程不够灵活。

运算符重载是对已经有的运算符赋予多重含义,同一个运算符作用于不同类型的数据将产生不同的行为。C++中的运算符只能是基本数据类型,很多用户自定义的行为需要用运算符重载实现,运算符重载扩充了C++语言本身的功能。

下面是运算符重载的一个例子,+可以完成两个int型数据加法,或者两个double类型的数据加法,如果要完成两个类对象的相加,需要使用重载。例子中定义了复数类并实现相加的功能。

2.C++可以重载的运算符

+

-

*

/

%

^

&

|

~

!

,

=

<=

>=

++

--

<< 

>> 

==

!=

&&

||

+=

-=

/=

%=

^=

&=

|=

*=

<<=

>>=

[]

()

->

->*

new

new[]

Delete

delete[]

C++不可以重载的运算符有:

::     .     .*     ?:
(1) 重载的运算符的优先级和结合性都不会改变运算符重载的规则如下:

(2) 运算符重载是对原有运算符的适当改造,一般地,重载的功能与原来的功能类似

(3) 运算符重载不能改变原运算符的操作对象个数,同时至少有一个操作数是自定义类型。

3.运算符重载的方式

运算符重载分为成员函数重载和友元函数重载两种。这里先介绍成员函数重载的方式,它的格式为:

<函数类型> operator <运算符>(<形式参数>)

{

···//<函数体>

}

运算符重载时,用operator作关键字,重载单目运算符时,形式参数表为空,调用单目运算符的当前对象是唯一的操作数,重载双目运算符时,形参表指定第二个操作数,第一个操作数即为调用运算符的对象本身。在上面介绍的例子中,重载+实现两个复数的相加,应该有两个操作数,但是由于使用了成员重载,形式参数表中只需要一个参数。

# include <iostream>
using namespace std;
class Complex
{
public:
	Complex(int i,int j):x(i),y(j){}
	Complex & operator+(Complex &);
	void print();
private:
	int x;
	int y;
};
Complex & Complex::operator+(Complex & a)
{
x+=a.x;
y+=a.y;
return *this;
}
void Complex::print()
{
cout<<x<<"+"<<y<<"i"<<endl;
}
int main()
{
	Complex t1(1,3);
	Complex t2(2,4);
	Complex t3=t1+t2;  //
	t3.print();
	cin.get();
return 0;
}

运算符的友元重载形式为:

friend <函数类型> operator <运算符>(<形式参数>)

{

··· // <函数体>

}

从形式上看,友元重载单目运算符时,形式参数表为一个操作数,重载双目运算符时,形式参数表为两个参数,这一点与成员重载的方式不同。

# include <iostream>
using namespace std;
class Complex
{
public:
	Complex(){}
	Complex (int i,int j):x(i),y(j){}
	void print();
	friend Complex & operator+(Complex &a,Complex &b);
private:
	int x;
	int y;
};
Complex & operator +(Complex &a,Complex &b)
{
	Complex c;
c.x=a.x+b.x;
c.y=a.y+b.y;
return c;
}
void Complex::print()
{
cout<<x<<"+"<<y<<"i"<<endl;
}
int main()
{
	Complex t1(1,2);
	Complex t2(2,3);
	Complex t3=t1+t2;
	t3.print();
	cin.get();
return 0;
}

上面的介绍了成员函数和友元函数重载运算符,什么时候用成员函数的形式重载运算符,什么时候用友元函数的形式重载运算符?这里有一些经验规则:

(1) = [] () ->必须用成员函数的形式重载

(2) 复合赋值运算符通常定义为类的成员

(3) 改变对象状态或与给行类型紧密联系的运算符,如自增、自减、解引用通常定义为类成员

(4) 对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符,最好定义为友元函数

抱歉!评论已关闭.