다음을 통해 공유


함수 오버로드

C++에서는 동일한 범위에서 이름이 같은 함수를 둘 이상 지정할 수 있습니다. 이러한 함수는 오버로드된 함수라고 하며 오버로드에 자세히 설명되어 있습니다. 프로그래머가 오버로드된 함수를 사용하면 인수의 형식 및 수에 따라 함수에 대한 서로 다른 의미 체계를 제공할 수 있습니다.

예를 들어 문자열(또는 char *) 인수를 사용하는 print 함수는 double 형식의 인수를 사용하는 함수와 상당히 다른 작업을 수행합니다. 오버로드를 사용하면 일관된 이름을 지정할 수 있으며 프로그래머가 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++의 다른 요소에 영향을 주는 방법에 대한 내용은 오버로드를 참조하십시오.

참고 항목

참조

함수 선언