欢迎来到论文网! 识人者智,自知者明,通过生日认识自己! 生日公历:
网站地图 | Tags标签 | RSS
论文网 论文网8200余万篇毕业论文、各种论文格式和论文范文以及9千多种期刊杂志的论文征稿及论文投稿信息,是论文写作、论文投稿和论文发表的论文参考网站,也是科研人员论文检测和发表论文的理想平台。lunwenf@yeah.net。
您当前的位置:首页 > 科技论文 > 计算机论文

函数重载与运算符重载的应用研究

时间:2011-04-23  作者:秩名

论文导读:多态性是面向对象的程序设计中的三大基本特征(封装性。多态性)之一。重载在C++中可分为两种:函数重载和运算符重载。运算符重载实质上就是函数重载。
关键词:面向对象,多态性,函数重载,运算符重载
1. 引言
多态性是面向对象的程序设计中的三大基本特征(封装性,继承性,多态性)之一,其含义是指同一个消息被不同类型的对象接收时会导致不同的的行为实现。在C++中,多态性包括强制多态、重载多态、参数类型多态和包含多态四种。其中,重载是实现C++多态性的一种重要机制,称为重载多态,即为程序正文中相同作用域内的的同一个标识符赋予不同的操作语义,实质上也就是实现了程序空间到代码空间的一对多映射。重载在C++中可分为两种:函数重载和运算符重载。
2. 函数重载
在程序编译时,让相同的函数名映射到不同的函数代码,称为函数重载。在C++中,函数重载可以分别以普通函数和成员函数来实现。
2.1 普通函数重载
例1:
#include <iostream.h>
int max(int x,int y){returnx>y?x:y;}//求2个整数的最大值
int max(int x,int y,int z) //求3个整数的最大值
{returnx>y?(x>z?x:z):(y>z?y:z);}
void main( )
{cout<<max(1,2)<<' '<<max(1,2,3);
}
运行结果为:
2 3
例1中定义了两个最大值max函数,都是普通函数,即非成员函数,分别求2个、3个整数的最大值。主函数中,在cout输出流语句中两次调用函数max,由于实参个数的不同,第一次调用映射到的是求2个整数的最大值函数max,输出2;第二次调用映射到的是求3个整数的最大值函数max,输出3。
2.2 成员函数重载
例2:
#include <iostream.h>
class A
{public:
A( ): a(0){cout<<'DefaultConstructing '<<a<<endl;} //无参构造函数
A(int x): a(x){cout<<'Constructing'<<a<<endl;} //有参构造函数
private:
int a;
};
void main( )
{ A a1,a2(1); }
运行结果为:
Default Constructing 0
Constructing 1
例2中声明了A类,其中定义了两个构造函数:无参构造函数和有参构造函数,它们都是类中特殊的成员函数,形成重载。主函数中,依次定义了两个A类对象a1和a2,由于实参个数的不同,编译器依次自动调用无参构造函数和有参构造函数完成无参对象a1和有参对象a2的初始化,形成结果中的两行输出。
由此可见,当通过相同的函数名调用重载的多个函数时,编译器会以调用时的实参类型、个数和次序为依据进行重载解析,因此,不难想象,重载的多个函数须在形参类型、个数和次序这三个方面不完全相同,否则将会出现二义性,即不能正确地重载解析。
3. 运算符重载
运算符重载实质上就是函数重载,它是C++中的一大亮点,通过这种机制,我们可以很方便地对绝大多数运算符的语义进行扩充,使之能对类类型中的对象进行操作和运算。需要注意的是,重载前后,运算符的优先级和结合性不变;运算符所带操作数的个数不变;不能对运算符重载函数设置默认参数;并且不能凭空臆造出原本没有的运算符进行重载。
一般来讲,可以有三种方式实现运算符重载,即普通函数方式、成员函数方式和友元函数方式。由于类的封装性,使得通常情况下普通函数对类中成员的访问受限,所以这种方式很少采用,不作讨论;另外,由于友元可以无限制地访问类中的所有成员,会破坏类的封装性,因此从原则上说,要尽量将运算符重载函数作为成员函数。但考虑到各方面的因素,一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。
3.1 成员函数方式
例3:
#include <iostream.h>
class Complex //复数类
{public:
Complex(doublex,double y): real(x), imag(y) { }
Complex operator++( )//前置增量运算符'++'重载为成员函数
{++real; ++imag; return*this;}
Complexoperator++(int)//后置增量运算符'++'重载为成员函数
{Complex temp(*this);real++; imag++; return temp;}
private:
double real,imag;//实部、虚部
};
int main( )
{ Complex c(1,2); }
例3中声明了一个复数类Complex,其中有两个私有数据成员,分别表示实部和虚部。主函数执行时,编译器会自动调用构造函数创建对象c,即1+2i。在复数类Complex的声明中,以成员函数方式分别对前置、后置增量运算符这两个单目运算符进行了重载,使得Complex类对象可以进行前置、后置增量运算。论文发表。值得注意的是两者的区别,即后置增量运算符的重载函数中多一个int形参,它没有实际意义,只是为了区别于前置增量运算符的重载函数。
3.3 友元函数方式
可以在例3复数类Complex的声明中增加以下代码:
friend ostream&operator<<(ostream &output,Complex &c)
{ //流插入运算符'<<'重载为友元函数
output<<c.real;
if (c.imag)output<<'+'<<c.imag<<'i';
output<<endl;
return output;
}
上述代码以友元函数方式对流插入运算符'<<'进行了重载,使得Complex类对象可以通过流插入运算符'<<'实现输出。在例3的主函数中增加以下代码:
cout<<c; //①
cout<<++c;//②
cout<<c++;//③
运行结果为:
1+2i
2+3i
2+3i
①处执行时,编译器的理解为operator<<(cout, c),即调用重载后的流插入运算符'<<'函数,输出对象c,形成结果中的第一行;②处执行时,首先++,编译器的理解为c. operator++( ),即调用重载后的前置增量运算符'++'函数。论文发表。论文发表。然后<<,编译器的理解为operator<<(cout,c),即调用重载后的流插入运算符'<<'函数,输出前置增量运算后的对象c,形成结果中的第二行;③处执行时,首先++,编译器的理解为c. operator++(int),即调用重载后的后置增量运算符'++'函数。然后<<,编译器的理解为operator<<(cout, c),即调用重载后的流插入运算符'<<'函数,输出后置增量运算后的对象c,形成结果中的第三行。
3.4 类型转换函数
运算符重载中还有一种比较特殊的是强制类型转换运算符重载函数,重载后成为类的特殊成员函数,在适当的时候由编译器自动调用以实现类类型对象向普通数据类型数据的强制转换。可继续在例3 Complex类的声明中增加以下代码:
operator double( ){return real;} //强制类型转换运算符重载为成员函数
然后在主函数末尾增加一句:cout<<(c+5.0);
此时,编译器首先执行c+5.0,由于没有对算术运算符'+'进行重载,所以编译器只能调用刚刚增加的类型转换函数operator double( )将Complex类对象c强制类型转换成double类型,由于经过了上述两次增量运算,此时对象c的实部real已经等于3.0;然后与5.0相加,最后输出结果为8.0。
4. 结语
以上对函数重载和运算符重载的概念,用法和区别进行了讨论。重载的目的是为了实现表达方式共享,熟练地掌握并运用重载,特别运算符重载,可以有效地提高程序的可读性,实现对C++语言本身的扩充,同时也能更深刻地理解C++中多态性的实现机制。

参考文献:
[1] 钱能. C++程序设计教程[M]. 北京: 清华大学出版社, 1999
[2] 曹计昌等著. C++语言及面向对象程序设计[M]. 北京: 高等教育出版社, 2004
[3] 郑莉, 董渊. C++语言程序设计[M]. 北京:清华大学出版社, 1999
 

查看相关论文专题
加入收藏  打印本文
上一篇论文:广州地铁三号线综合监控系统网络蠕虫防治策略
下一篇论文:鹤山市农配网常见故障分析与对策
科技论文分类
科技小论文 数学建模论文
数学论文 节能减排论文
数学小论文 低碳生活论文
物理论文 建筑工程论文
网站设计论文 农业论文
图书情报 环境保护论文
计算机论文 化学论文
机电一体化论文 生物论文
网络安全论文 机械论文
水利论文 地质论文
交通论文
相关计算机论文
    无相关信息
最新计算机论文
读者推荐的计算机论文