C++运算符重载剖析

时间:2022-05-06 01:45:46

摘要: 重载是面向对象程序设计中的一种重要机制,可以提高程序可读性,实现多态性。C++语言中有两种重载:函数重载和运算符重载。运算符重载实质就是函数重载。本文主要讨论的是C++中运算符重载的规则、机制以及形式。

Abstract: Overloading is one of the important mechanisms in object oriented programming, it can improve the readability of the program to achieve polymorphism. There are two kinds of overloading in C++ language: function overloading and operator overloading. In fact, operator overloading is overloaded functions. This paper mainly discusses the rules, mechanisms and forms of operator overloading in C++.

关键词: 程序设计;面向对象;函数重载;运算符重载;多态性

Key words: program design;object oriented;function overloading;operator overloading;polymorphism

中图分类号:TP312.1 文献标识码:A 文章编号:1006-4311(2014)17-0213-02

1 绪论

自然语言中的“一词多义”,反映到程序中就是重载。例如“行动”、“银行”,“行”到底发何音,是何意,要根据上下文理解。

在C语言中,运算符符“-”既表示两数相减,又表示取一个数的相反数;既可作用于整型数据,又可作用于实型、指针等其它类型的数据,这就是运算符重载。C++是C功能的扩充,比C更完善,更全面。

所谓运算符重载就是同一个运算符,根据不同的数据类型有着不同的含义和运算,具体含义要根据上下文理解。重载扩充了C++预定义的运算符的运算范围,运算符既可对已有数据类型进行运算,又可对用户自己定义的新类型数据进行运算,方便编程。

2 运算符重载语法形式

格式:函数类型 operator 运算符(形参表)

{函数体;}

功能:operator与运算符的组合就是函数名。

运算符重载实质就是函数重载, C++在编译过程中,把operator与运算符的组合解释为函数名,然后按照函数的定义、引用处理。

例1 class Co //复数类

{ public:

Co(double r=0,double i=0) //构造函数

{ rd=r;im=i;}

Co operator+( const Co &c1); //重载运算符

{return Co(rd+c1.rd,im+c1.im);}

private:

double rd;//实数

double im;//虚数

};

inline co Co::operator +(const Co &c1)

{return Co(rd + c1.rd, im + c1.im);}

main()

{Co x(2.5,8.6),y(5.4,3.2),z;

int i=5,j=6,k;

k=i+j; //+用C++原来+的含义

z=x+y; //+用operator+函数实现,重载原来+的含义

}

可重载的运算符

+ - * / % ^ & |

+= -= *= /= %= ^= &= |=

++ > ! < > && ||

-- = != = ~ ,

->* -> [] () new delete = ==

可重载的运算符

.*和->成员指针运算符。分量运算符 :: ?:sizeof

3 运算符重载的规

①重载的运算符有限制。②不能改变原运算符的优先级、结合性、操作数的个数、语法结构。③对已有的C++运算符重载。④当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个。原因是成员函数通过this指针隐式地访问类对象的参数;当重载为类的友元函数时,参数个数与原操作数个数相同。⑤运算符重载实质上是函数重载,因此编译程序按照函数重载的处理办法对运算符重载进行处理。⑥旧类型旧含义,新类型新含义,新含义与旧含义功能相似。

4 运算符重载形式

4.1 重载为类的成员函数 如例1所示。程序中出现的表达式:x+y编译程序将给解释为:x.operator+(y),其中,x和y是Co类的对象。operator+()是运算+的重载函数。该运算符重载函数仅有一个参数y。可见,当重载为成员函数时,双目运算符仅有一个参数。对单目运算符,重载为成员函数时,不能再显式说明参数。重载为成员函数时,总时隐含了一个参数,该参数是this指针。this指针是指向调用该成员函数对象的指针。

4.2 重载为友元函数 运算符重载函数还可以为友元函数。当重载友元函数时,将没有隐含的参数this指针。这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。但是,有些运行符不能重载为友元函数,它们是:=,(),[]和->。

重载为友元函数的运算符重载函数的定义格式如下:

friend operator (){……}

例2 class Co //复数类

{ public:

Co(double r=0,double i=0) //构造函数

{ rd=r;im=i;}

friend Co operator +(const Co &c1, const Co &c2);

private:

double rd;//实数

double im;//虚数

};

Co operator +(const Co &c1, const Co &c2)

{return Co(c1.rd + c2.rd, c1.im + c2.im);}

main()

{Co x(2.5,8.6),y(5.4,3.2),z;

z=x+y; //+用operator+函数实现,重载原来+的含义

}

对于双目运算符,重载为成员函数时,仅一个参数,另一个被隐含;重载为友元函数时,有两个参数,没有隐含参数。因此,程序中出现的 x+y编译程序解释为:operator+(x, y)调用函数Co operator +(const coplex &c1, const Co &c2)进行求值。

5 重载输出流运算符

例3 class Co //复数类

{ public:

Co(double r=0,double i=0) { rd=r;im=i;} //构造函数

friend ostream &operator

private:

double rd;//实数

double im;//虚数

};

ostream &operator

{ output

if(c.im>0) output

if(c.im!=0) output

return output;}

main()

{Co x(2.5,8.6),y(5.4,-3.2);cout

cout

程序运行结果是:2.5+8.6i

5.4-3.2i

6 结语

多态性是面向对象程序设计的重要支柱之一,而运算符重载又是实现多态性的一个重要途径。运算符重载使得程序员把运算符的使用扩展到操作数是对象的情况,由运算符构成的表达式常常比函数调用更简洁易懂,熟练掌握运算符重载,以提高C++编程能力。

参考文献:

[1]钱能.C++程序设计教程[M].清华大学出版社,2006.

[2]郑莉.C++语言程序设计[M].清华大学出版社,2002.

[3]杨俊清.C++程序设计[M].西安电子科技大学出版社,2003.

上一篇:专业鉴黄师:看“片”看到吐 下一篇:浅析在线考试主观题智能阅卷算法的设计与实现