函数调用运算符operator
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例9.3 常成员函数举例。
class M{ int m1,m2; public: M(int x,int y){ m1 = x ; m2 = y ;} void print ( ) { cout<<m1<<”,”<<m2<<endl; } void print ( ) const ; }; void M::print ( ) const { cout<<m1+m2<<endl; } void main ( ){ M a (5,4); a.print ( ) ; const M b(8,7); b.print ( ) ; }
Biblioteka Baidu
int abs(int x){ return (x>=0 ? x: -x ); } double abs(double x){ return (x>=0 ? x: -x ); } lone abs(lone x){ return (x>=0 ? x: -x ); }
表面上,似乎这三个函数的代码 相同。实际上编译时产生的代码是 不同的,程序运行时在内存中的存 放位置也是不同的。
第9章 重载
C++ 语言提供了一种机制,使得 对于不同的输入参数,使用统一 的函数名(如例9.1的abs())定义 各种不同输入参数时的实现版本, 由编译程序根据函数参数的不同 而选择使用相应的实现代码。这 就叫做函数的重载。
1.重载的概念 (1)
例9.1 求绝对值函数abs( )的重载
另外,C++中由于引入了大量扩 展数据类型,特别是通过类的定义 引入的各种外部类型,希望能够用 比较简洁的、统一的形式来书写这 些自定义类型的表达式。比如,对 于一个复数类Complex的对象C1和 C2,若想不用 Complex_ADD (C1 ,C2), 而用C1+C2的形式来书写 这两个对象的求和式,这就需要使 “+”运算符重载复数Complex类求 和运算。
2.1 函数重载的区分机制
重载函数靠参数不同而区分不同调用版本。决定参数是否相 同有参数个数、参数顺序、参数类型等要素。 1.用参数区分函数重载的不同调用版本 如length ()函数的重载说明: int length (int x); int length (int x, int y); double length (double x1, double x2, double y1, double y2); 这三个函数,由于它们的函数名相同,参数不同而成为重载 函数,与它们返回值类型相同并无关系。
int sum (int x, int y);和 double sum (int a, int b); 这两个函数不是重载函数,因为它们参数 个数和类型都相同,尽管它们的返回值类 型不同、形式参数名也不同。编译程序认 为它们是对一个函数的重新定义(override) 另外不同的参数传递方 式也无法区分重载函数, 如: int func1(int value); int func1(int &value); 不能作为重载函数。
2.const关键字可以被用于参与对重载 函数的区分 常成员函数:
在一个类中使用const关键字说明的成员函数, 称为常成员函数。常成员函数说明格式如下: 函数类型 函数名(<参数表>)const ; 其中, const是加在函数说明后面的类型修饰符, 它是函数说明的一个组成部分,因此,在函数的 实现部分也要带const关键字。常成员函数不更新 对象的数据成员,也不能调用该类中其它没有用 const修饰的成员函数。
程序运行结果:
5, 4 15
在类M的成员中,说明了两个同名的成员函数print(),但它们的类型不同,如 下所示: void print ( ) ; void print ( ) const ; 这是重载的成员函数。表达式:a.print()将调用成员函数:void print ( ); 而表达式:b.print ( ) 将调用成员函数:void print ( ) const ;
例9.2 试分析下面的程序及调用结果,
并说明get_area()函数是否属于函数重载。
#include<iostream.h> class point{ double x,y; public: point(double a, double b){ x=a; y=b; } double get_area() { return 0; } }; class circle: public point{ int r; public: circle(int rad, int a, int b):point(a,b) { r=rad; } double get_area() {return 3.1416*r*r;} }; void main() { point p1(3,7); circle c1(2,3,4),c2(5,1,4); cout<<c1.get_area()<<endl; cout<<p1.get_area()<<endl; cout<<c2.get_area()<<endl; cout<<c2.point::get_area()<<endl; } 运行结果: 12.5664 0 78.54 0 本例实际上也是派生类中同名函数的重 定义。可以简单地认为,加上对象名或 类名前缀后,c1.get_area()和p1.get_area() 不再被看作同名函数。
重载的概念 (2)
2.函数重载
函数重载就是用同一个标识符命名语义相近的一组 函数。函数重载作为一种符号抽象工具。程序员可 以利用这个工具定义一个抽象函数,其函数名描述 一组函数功能的共同点,以减少由于大量符号定义 带来的记忆负担。值得注意的是, C++语言并没有 提供重载函数之间的任何约束,如果用相同的名字 定义互不相关的函数,只会产生增加程序复杂性的 负面效果。
重载的概念 (2)
•重载分为函数重载和运算符重载。
•函数重载由参数形式区分同名函数的不同版本。 •构造函数重载是函数重载的主要应用之一,它为 对象创建提供了灵活方便的内部状态初始化手段。 •运算符重载使自定义抽象数据类型能像基本数据 类型一样用系统已定义的运算符来书写表达式,这 就使得对象的使用像内部变量一样自然和方便,因 而带来了更加自然的系统可扩展性。