时间: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.