再上一篇:5.5 内联函数
上一篇:5.6 具有缺省参数值和参数个数可变的函数
主页
下一篇:5.8 编译预处理
再下一篇:5.9 程序的多文件组织
文章列表

5.7 函数的重载

《VC++程序设计基础》,讲述C++语言的语法和标准库,以及Visual C++ 函数库和MFC类库的使用,并附相关代码示例。

C++语言提供了二种重载:函数的重载和运算符的重载。本节讨论函数的重载。所谓函数的重载(overload)是指完成不同功能的函数可以具有相同的函数名。当然,这种函数的定义必须符合函数重载的规定。我们以例来说明函数重载的方法及其使用。

例 5.15 重载求绝对值的函数,实现求整数、单精度和双精度实数的绝对值。#include

int abs (int x) //A

{

if (x < 0 ) return (-x); else x;

}

float abs ( float x ) //B

{

return (x<0? -x : x );

}

double abs(double x) //C

{

return (x<0? -x : x );

}

void main(void)

{

int a;

float b;

double c;

cout << "按序输入一个整数、一个单精度数和一个双精度数:\n";

cin >> a >> b >> c;

cout << "它们的绝对值分别是:\n";

cout << "abs(" << a << ")=" << abs(a) << "\n"; //D

cout << "abs(" << b << ")=" << abs(b) << "\n"; //E

cout << "abs(" << c << ")=" << abs(c) << "\n"; //F

}

在本例中分别定义了三个求绝对值的函数,它们分别求出整型数,单精度数和双精度数的绝对值。这三个函数的函数名是相同的。显然,这种用法对用户来说是十分方便的,记住一个函数名,就可实现求三种不同类型数据的绝对值。

因为重载的函数具有相同的函数名,当通过函数名调用重载的函数时,C++的编译器是如何确定应该调用哪一个函数呢?编译器是根据函数的实参来确定应该调用哪一个函数的。如上例中,当实参为整型时,则调用由A行开始定义的函数;当实参为双精度型时,则调用由C行开始定义的函数。

定义重载函数时要注意以下几点:

1、定义的重载函数必须具有不同的参数个数,或不同的参数类型。只有这样编译系统才有可能根据不同的参数去调用不同的重载函数。

2、仅返回值不同时,不能定义为重载函数。如:

float fun( float x)

{

......

}

void fun (float x)

{

......

}

上面定义的二个函数,函数名相同,参数的个数和类型也相同,仅返回值不同,这将导致编译错误。仅函数的返回值不同时,编译程序无法确定调用的是哪一个重载函数,这是由于C++允许用return语句计算的要返回值类型可以与函数的类型不同(这时由系统做强制类型转换),在调用函数时编译器并不关心函数的返回值类型,而是在函数返回时才涉及到函数的返回值类型。

函数重载从一个方面体现了C++语言对OOP多态性的支持,用同一个函数名实现“多个入口”或称为“同一接口,多种实现方法”的多态性机制。