您的位置:首页 > 编程语言 > C语言/C++

C++学习 【4.4】 利用函数实现指定的功能---函数的重载、函数模板、有默认参数的函数

2016-01-26 00:00 716 查看
摘要: 学习《C++程序设计》(第二版) 谭浩强 主编 第四章 关于函数的调用 【4.8】函数的重载 【4.9】函数模板【4.10】有默认参数的函数

4.8 函数的重载

C++允许用同意函数名定义多个函数,而这些函数的参数个数和参数类型可以不相同。

函数的重载(function overloading):即对一个函数名重新赋予它新的含义,是一个函数名可以多用。

所谓重载,其实就是“一物多用”。

重载函数并不要求函数体相同。

重载函数的参数个数、参数类型或参数顺序三者中必须至少有一种不同,函数返回值类型可以相同也可以不同。

4.9 函数模板

4.8介绍的函数的重载可以实现一个函数名多用,将实现相同的或类似功能的函数用同一个函数名来定义。这样使编程者在调用同类函数时感到含义清楚,方法简单。

但是在程序中仍然要分别定义每一个函数。

为了解决这个问题,C++提供了函数模板(function template)

所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用的函数就是函数模板。

凡是函数体相同的函数都可以用这个模板来代替,不必要定义多个函数,只需要在模板中定义一次即可。

在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。

#include <iostream>
using namespace std;
template <typename T>        //模板声明,其中T为类型函数
T max(T a, T b, T c)         //定义一个通用函数,用T作虚拟的类型名
{...}

定义函数模板的一般形式为template<typename T > 或 template <class T>

template的含义是模板,T为类型参数,实际上是一个虚拟的类型名,表示Tshi一个类型名,但是现在未指定它为那一种具体的类型。

要等到函数调用时根据实参的类型来确定T是什么类型。

class和typename的作用相同,都是表示“类型名”,二者可以互换。

以前的C++程序员都用class。template是不久前才被加到标准C++的。

注意:函数模板只适用于函数体相同、函数的参数个数相同而类型不同的情况。

4.10 有默认参数的函数

有时多次调用同一函数时用同样的实参,C++提供简单的处理办法,给形参一个默认值,这样形参就不一定要从实参取值了。

//如有一声明声明
float area(float r=6.5)

形参与实参的结合是从左至右顺序进行的,第一个实参必然与第一个形参结合......

因此指定默认值的参数必须放在形参表列中的最右端,否则出错。

可以看到,在调用有默认参数的函数时,实参的个数可以与形参不同,实参未给定的,从形参的默认值得到值。

注意:

必须在函数调用之前将默认值的信息通知编译系统。

如果在函数调用之前未得到默认值的信息,在编译到函数调用时,就会认为实参个数与形参个数不匹配而报错。

如果函数的定义在函数调用之前,则应该在函数定义中给出默认值。

如果函数的定义在函数调用之后,则咋函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义时可以不给出默认值。

一个函数不能既作为重载函数,又作为有默认参数的函数。

因为当调用函数时如果少写一个参数,系统无法判定是利用重载函数还是利用默认参数的函数,出现二义性,系统无法执行。

注:以上第4.7~4.10节的内容(内置函数、函数的重载、函数模板和有默认参数的函数)在C里是没有的,是C++增加的。在编写较大的程序时,会用到他们,以提高编程的质量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息