文档介绍:C++基础知识3
信息学院
李崇威
ise_******@ujn.
QQ: 58296786
C++基础知识3
函数重载
模版
继承与派生
多态
函数重载
函数的重载也称多态函数。C++允许功能相近的函数在相同的作用域内以相同函数名声明,但是形参的个数或者形参的类型不应相同,编译系统会根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是所谓的函数重载。
对于没有重载机制的C语言,每个函数必须有其不同于其它函数的名称,即使操作是相同的,仅仅数据的类型不相同,也需要定义名称完全不同的函数,这样就显得重复且效率低下。
例如,定义求两个数中较大值的函数,就必须对整数、浮点数以及双精度数分别用不同的函数名实现:
int imax (int x, int y)
{ return (x>y) ? x : y; }
float fmax (char x, char y);
{ return (x>y) ? x : y; }
double dmax (double x, double y);
{ return (x>y) ? x : y; }
程序在调用上述三个不同类型的函数时,是以名字加以区别的,需要记住并区别它们的名称。显然,这样就造成了代码的重复,使用起来也不方便,更不利于代码的维护。
对于具有重载机制的C++语言,允许功能相近的函数在相同的作用域内以相同函数名定义,因而使函数方便使用,便于记忆,也使程序设计更加灵活。
仍以上例而言,在C++中只要用一个函数名即可,如max( ),然后以调用此函数的参数类型来决定是要比较int型、float型,还是double型的数的大小。
例:实现上例
#include <iostream>
using namespace std;
int max(int x, int y)
{ return (x>y) ? x : y; }
float max(float x, float y)
{ return (x>y) ? x : y; }
double max(double x, double y)
{ return (x>y) ? x : y; }
void main( )
{
cout<<max(3, 5)<<endl;
cout<<max(, )<<endl;
cout<<max(, )<<endl;
}
使用说明
重载函数的形参必须不同:个数不同或类型不同。
编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。
编译器不以返回值来区分重载函数。
编译器不以形参名来区分重载函数。
不能用typedef定义的类型名来区分重载函数声明中的参数。
不要将不同功能的函数声明为重载函数。让重载执行不同的功能,是不好的编程风格。同名函数应该具有相同的功能。
模版的引入
看下面三个求两个数中最大值的函数。
int max (int x, int y)
{ return (x>y) ? x : y; }
float max (float x, float y)
{ return (x>y) ? x : y; }
double max (double x, double y)
{ return (x>y) ? x : y; }
这三个函数只有参数类型不同,功能完全一样。即使设计为重载函数,也只是使用相同的函数名,而函数体仍然要分别定义。
类似这样情况,如果能写一段通用代码适用于多种不同数据类型,便会使代码的可重用性大大提高,从而提高软件开发效率。使用模版就是为了这一目的。
模版
C++的最重要特性之一就是代码重用。为了代码重用,代码必须是通用的。而通用代码必须不受使用数据类型的影响。
模板就是实现代码重用机制的一种工具,它是由可以使用和操作任何数据类型的通用代码构成,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码重用。
模板分为函数模板和类模板,它们分别允许用户构造模板函数和模板类。
函数模版
函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。
函数模版的定义形式:
template <typename 标识符>
返回类型函数名(模板形参表)
{
函数体
}
其中,template是一个声明模板的关键字,它表示声明一个模板。 typename也可以写成class。