C++运算符重载剖析

2024-07-04

C++运算符重载剖析(精选4篇)

C++运算符重载剖析 篇1

0 引言

多态性是面向对象程序设计的重要特征之一, 它与封装性和继承性共同组成面向对象的程序设计的三大基本特征, 在函数重载中, 同一个函数名可对应若干种不同的实现, 依据函数参数的类型、个数和顺序来确定某个实现。在运算符重载中, 同一个运算符对应着很多种功能, 这些功能是通过函数来定义的, 依据操作数的类型来确定应选运算符的功能。我们接触的还有另一种是指同样的消息被不同类的对象接受时产生完全不同的实现, 该情况大多产生在多类继承中不同类中的相同说明的成员函数的多态行为。其中多态性分为专用多态和通用多态, 专用多态分为强制多态和重载多态;通用多态分为参数多态和包含多态。其中重载是实现C++多态性的一种十分重要的机制, 成为重载多态, 即为程序正文中相同作用域内的同一个标识符赋予不同的操作语义, 实质上就是实现了程序空间到代码空间的一对多映射。

1 函数重载

简单地说函数重载就是赋给同一个函数名多个含义。在我们学的C++中函数重载分为普通函数的重载和成员函数的重载, 也就是说我们所学的函数重载可以以两种不同的方式来实现, 就是我们所说的普通函数的重载和成员函数的重载。

1.1 普通函数的重载

例1:

运行的结果:1.2, 3.2

上一例题中, 两个函数都是普通的函数重载, 由于主函数中调用的两个函数对应的参数个数不同, 所以通过形参和实参的结合, 我们得到了运行的结果。

1.2 成员函数的重载

例2:

运行结果为:Default Constructing 0

Constructing 3

这是一个很常见的习题, 该函数调用了构造函数的两种形式, 有参和无参, 对应于主函数中带有不同形式参数的函数, 我们得到不同的结果。

2 运算符重载

运算符重载就是就是赋予已有的运算符多重含义, 即多种功能。C++语言中通过重新定义运算符, 使它能够用于特定类的对象执行的特定的功能。一般情况下运算符重载有两种形式, 重载为类的成员函数和重载为有元函数两种。

2.1 重载为类的成员函数

例1:

2.2 重载为有元函数

执行的结果同例1, 两种运算符比较, 我们知道单目运算符最好被重载为成员函数, 双目运算符最好被重载为有元函数。

3 结论

以上我们总结了函数重载和运算符重载的区别和特点。众所周知, 重载是为了以不同的方式来实现函数, 我们如果熟练的应用这门技术, 可以提高程序的运行效率和可读性, 通过学习, 使我们更透彻地理解了C++的多态性问题。

参考文献

[1]谭浩强.C语言程序设计[M].3版.北京:清华大学出版社, 2005, 8.

[2]吕凤翥.C++语言基础教程[M].2版.清华大学出版社, 2007, 2.

[3]Stanley B.Lippman.C++Primer中文版[M].人民邮电出版社, 2006, 3.

C++运算符重载剖析 篇2

? 把一个 int类型变量 赋值给一个 Complex对象

? 把一个 char * 类型的字符串 赋值给一个 字符串对象

需要 重载赋值运算符 ‘=’

赋值运算符 “=” 只能重载为 成员函数

编写一个长度可变的字符串类String

? 包含一个char * 类型的成员变量

—> 指向动态分配的存储空间

? 该存储空间用于存放 ‘’ 结尾的字符串

class String { private: char * str; public: String : str(NULL) { } //构造函数, 初始化str为NULL const char * c_str() { return str; } //返回值为const类型,保证str不会被修改,

PKU C++程序设计实习学习笔记4 运算符重载

C++中运算符的重载应用 篇3

关键词:运算符,函数重载,应用

一、什么是运算符的重载

运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的表达式的行为。运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算符表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。

例如:用“+”运算符完成两个实数、两个复数、两个字符串的相关运算。两个实数a=10,b=2,则两个实数相加的结果是:a+b=10+2=12;两个复数:a=10+2i,b=2+10i,则两个复数相加的结果是:a+b=12+12i;两个字符串:a=“visual”,b=“studio”,则两字符串连接的结果是:a+b=“visual studio”。由上例可以看出,同一个运算符“+”可以用于完成实数加法、复数加法及字符串连接等不同的运算,得到不同的结果。这就是“+”运算符的重载。因此,所谓的运算符重载就是用同一个运算符完成不同的运算操作。

二、运算符重载的规则

对运算符进行重载需要遵守以下规则:

(1)重载运算符限制在C++语言中已有的并允许重载的运算符。C++中的运算符除五个运算符“.、*、::、sizeof、?:”之外,其它都可重载。

(2)重载之后运算符的优先级和结合性均不改变。这就是说,对运算符重载不改变运算符的优先级和结合性,并且运算符重载时,单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。

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

(4)重载运算含义必须清楚,不能产生二义性。运算符的重载实质是函数重载。运算符重载一般分两种形式,即重载为类的成员函数和重载为类的友元函数,这两种形式都可访问类中的私有成员。

三、运算符重载的实现

在C++中,运算符的重载有两种方法:使用类的成员函数重载和使用fiend函数重载。下面通过实例来说明这两种重载方法的实现。

1、使用成员函数重载运算符

运算符重载函数为类的成员函数的常见格式为:

返回类型类名::operator重载运算符(参数表)

{函数体}

其中,函数类型指定重载运算符的返回值类型;operator是定义运算符重载函数的关键字;运算符是要重载的运算符名称;参数表中给出重载运算所需要的参数和类型。一般情况下,单目运算符采用成员函数形式重载时,操作数由对象的this指针给出,不需要参数;双目运算符采用成员函数形式重载时,一个操作数是对象本身的数据,由this指针指出。参数表的参数为第二操作数,只需一个参数。总之,当运算符重载为类的成员函数时,除后置“++、--”外,函数的参数个数比原来的操作数个数少一个。

实例:定义一个复数类,重载“=”运算符,使这个运算符能直接完成复数的赋值运算。

该重载函数的函数名为“operator=”,返回类型为void,形参为复数类对象的引用complex&c。当程序执行主函数中的赋值语句c2=c1而遇到赋值运算符“=”时,自动调用赋值运算符“=”重载函数“operator=()”,并将“=”运算符右边的操作数c1作为实参,左边操作数c2作为调用重载函数的对象,即作了一次c2.operator=(c1)的函数调用。在函数的调用过程中,实参c1传给形参c,在函数体内完成了复数实部与虚部的赋值操作。

2、使用frie nd函数重载运算符

对于运算符op,如果它的一个操作数为类A的对象,就可以将运算符重载为A类的友元函数,该函数有两个形参,其中一个形参的类型是A类。经过这样的重载后,表达式k op t就相当于函数调用operator op(k,t)。与使用成员函数定义的方法相比较,友元函数的一般定义格式只是在前面多了一个关键字friend,其他项目含义相同,除格式差别外,友元函数不是k所在类的成员函数。运算符重载函数为友元函数的一般定义格式为:

Friend类型operator重载运算符(参数表)

{函数体}

四、应用运算符重载应注意的问题

由于C++语言支持函数重载,所以才能将运算符当成函数来使用。但是在编程过程中要适当运用运算符重载:既不要因过分担心自己不会用而不使用,它的本质仍然是程序员们熟悉的函数;也不要过度的使用,如果它不能使代码变得更加易读易写,那就别用,否则会增加程序出错的可能。同时在使用运算符的重载时还要注意如下问题:

■不能改变C++内部数据类型(如int,float等)的运算符

■不能重载“.”,因为“.”在类中对任何成员都有意义,已经成为标准用法。

■不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,而是难以确定优先级。

■对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。

参考文献

[1]兰添才.C++中函数重载与操作符重载的应用探讨[J].福建电脑,2003,(02).

[2]蓝雯飞,陆际光.C++语言的重载机制剖析[J].微计算机应用,2000,(05).

[3]李智.C++宏,函数重载与模板机制[J].电脑,1995,(05).

[4]李智.C++函数重载与继承机制的应用[J].中国金融电脑,1995,(08).

C++的函数重载剖析 篇4

在C语言中, 两个函数的名称不能相同, 否则会导致编译错误。而在C++中, 函数名相同而参数不同的两个函数被解释为重载。使用函数重载可以帮助程序员应付更多的复杂性, 避免了使用繁杂的函数名称。C++可以对不同功能赋予相同的函数名, 函数调用时, 由编译程序根据上下文 (实参的类型, 个数) 理解确定调用哪一个, 以方便用户管理和使用函数名。

自然语言中的“一词多义”, 反映到程序中就是重载。

例1通过重载求a的绝对值

2 匹配重载函数

C++允许功能相似的函数在相同的作用域内以相同的函数名声明, 从而形成重载。那么用户调用同名函数时, 编译程序如何确定 (匹配) 到底调用哪一个函数, 称为匹配重载函数。编译时, 根据作用域、返回值类型、函数名、形参类型、形参顺序把同名函数转换成不同名函数 (用函数内部名) , 内部函数名构成规则:作用域+返回值类型+函数名+形参列表。匹配重载函数时按以下优先级进行: (1) 精确匹配:参数匹配而不做转换, 或只做微不足道的转换。 (2) 隐式转换匹配。 (3) 自定义匹配。 (4) 编译程序寻找匹配函数时, 函数的类型不起作用。

2.1 重载函数必须在同一作用域内

int abs (int a) , double abs (double a) , void main () 在同一作用域内, main既可调用int abs (int a) , 又可调用double abs (double a) 。int abs (int a) , double abs (double a) 是重载函数。

2.2 重载函数具有不同的形参

不同的形参指的是形参类型不同、形参个数不同、形参顺序不同。

(1) 形参类型不同。如int add (int x, int y) ;float add (float x, float y) ;

(2) 形参个数不同。如int add (int x, int y) ;int add (int x, int y, int z) ;

(3) 形参顺序不同。如float add (int x, float y) ;float add (float x, int y) ;

函数int add (int x, int y) 、float add (float x, float y) 、int add (int x, int y, int z) 、float add (int x, float y) 、float add (float x, int y) 是重载函数。

例3 void main ()

2.3 精确匹配

实参形参个数相同, 类型基本一致称为精确匹配。例3均为精确匹配。

例4 void f (double) ;

2.4 隐式转换匹配

例5 void print (double) ;

2.5 不同功能的函数不能重载

功能相似的函数, 用相同函数名, 以增加可读性。功能不同的函数, 用不同函数名, 便于用户区分, 是一个良好的编程风格。

3 成员函数重载

非成员函数可以重载, 成员函数也可以重载, 只要函数在同一作用域内, 满足重载要求即可。如构造函数重载

例6 class time

4 结语

重载函数是面向对象程序设计的关键技术之一, 用于命名一组功能相似的函数, 这样做减少了函数名的数量, 便于程序的阅读。函数重载在类和对象中的应用比较多, 在类的多态性中, 有更多不同类型的函数重载 (运算符重载) 。应熟练掌握重载函数, 以提高C++编程能力。

摘要:本文介绍了什么是函数重载、为什么需要函数重载、编译器如何解决函数重名问题、编译器如何解析重载函数的调用。通过案例予以解释分析, 旨在提高C++编程质量。

关键词:程序设计,面向对象,函数重载

参考文献

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

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

【C++运算符重载剖析】推荐阅读:

运算法则07-14

简便运算06-01

运算技巧06-11

代数运算06-16

集合运算06-22

导数运算07-07

线性运算09-06

数量积运算05-23

运算放大电路07-02

语言的运算07-24

上一篇:地铁明挖基坑下一篇:刑法修正