函数重载

C++ 允许同一范围内具有相同名称的多个函数的规范。 这些函数称为重载函数,“重载”中对其进行了详细介绍。 利用重载函数,程序员可以根据参数的类型和数量为函数提供不同的语义。

例如,采用字符串(或 char *)参数的 print 函数执行的任务与采用“双精度”类型的参数的函数执行的任务截然不同。 重载允许通用命名并使程序员无需创建名称,例如 print_sz 或 print_d。 下表显示了 C++ 使用函数声明的哪些部分来区分同一范围内具有相同名称的函数组。

重载注意事项

函数声明元素

是否用于重载?

函数返回类型

参数的数量

参数的类型

省略号存在或缺失

typedef 名称的使用

未指定的数组边界

const 或 volatile(见下文)

尽管可根据返回类型区分函数,但无法基于此类型重载函数。如果在某个类中使用 Const 或 volatile 以应用于此类的 this 指针而不是函数的返回类型,则仅将二者用作重载基础。换言之,仅当 const 或 volatile 关键字遵循声明中函数的参数列表时,重载才适用。

示例

以下示例阐述如何使用重载。 默认参数中提供了解决同一问题的另一种方法。

// function_overloading.cpp
// compile with: /EHsc
#include <iostream>
#include <math.h>

// Prototype three print functions.
int print( char *s );                  // Print a string.
int print( double dvalue );            // Print a double.
int print( double dvalue, int prec );  // Print a double with a
//  given precision.
using namespace std;
int main( int argc, char *argv[] )
{
const double d = 893094.2987;
if( argc < 2 )
    {
// These calls to print invoke print( char *s ).
print( "This program requires one argument." );
print( "The argument specifies the number of" );
print( "digits precision for the second number" );
print( "printed." );
exit(0);
    }

// Invoke print( double dvalue ).
print( d );

// Invoke print( double dvalue, int prec ).
print( d, atoi( argv[1] ) );
}

// Print a string.
int print( char *s )
{
cout << s << endl;
return cout.good();
}

// Print a double in default precision.
int print( double dvalue )
{
cout << dvalue << endl;
return cout.good();
}

// Print a double in specified precision.
//  Positive numbers for precision indicate how many digits
//  precision after the decimal point to show. Negative
//  numbers for precision indicate where to round the number
//  to the left of the decimal point.
int print( double dvalue, int prec )
{
// Use table-lookup for rounding/truncation.
static const double rgPow10[] = { 
10E-7, 10E-6, 10E-5, 10E-4, 10E-3, 10E-2, 10E-1, 10E0,
10E1,  10E2,  10E3,  10E4, 10E5,  10E6
    };
const int iPowZero = 6;
// If precision out of range, just print the number.
if( prec < -6 || prec > 7 )
return print( dvalue );
// Scale, truncate, then rescale.
dvalue = floor( dvalue / rgPow10[iPowZero - prec] ) *
rgPow10[iPowZero - prec];
cout << dvalue << endl;
return cout.good();
}

前面的代码演示了文件范围内的 print 函数重载。

有关重载的限制以及重载如何影响 C++ 的其他元素的信息,请参阅重载

请参见

参考

函数声明