선언 일치
동일한 범위에서 동일한 이름의 두 함수 선언은 같은 함수 또는 오버로드된 두 개별 함수를 참조할 수 있습니다. 선언의 인수 목록에 동일한 형식의 인수가 포함되어 있으면(이전 단원 참조) 함수 선언은 같은 함수를 참조하고, 그렇지 않으면 오버로드를 사용하여 선택된 서로 다른 두 함수를 참조합니다.
클래스 범위는 엄격하게 준수되므로 기본 클래스에 선언된 함수는 파생 클래스에 선언된 함수와 같은 범위에 있지 않습니다. 파생 클래스의 함수가 기본 클래스의 함수와 동일한 이름으로 선언된 경우 파생 클래스 함수는 오버로드를 유발하는 대신 기본 클래스 함수를 숨깁니다.
블록 범위는 엄격하게 준수되므로 파일 범위에서 선언된 함수는 로컬로 선언된 함수와 같은 범위에 있지 않습니다. 로컬로 선언된 함수의 이름이 파일 범위에서 선언된 함수의 이름과 같을 경우 로컬로 선언된 함수는 오버로드를 유발하는 대신 파일 범위의 함수를 숨깁니다. 예를 들면 다음과 같습니다.
// declaration_matching1.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
void func( int i )
{
cout << "Called file-scoped func : " << i << endl;
}
void func( char *sz )
{
cout << "Called locally declared func : " << sz << endl;
}
int main()
{
// Declare func local to main.
extern void func( char *sz );
func( 3 ); // C2664 Error. func( int ) is hidden.
func( "s" );
}
위의 코드에서는 func 함수의 두 정의를 보여 줍니다. char * 형식의 인수를 사용하는 정의는 extern 문 때문에 main에 로컬입니다. 따라서 int 형식의 인수를 사용하는 정의는 숨겨지며, func에 대한 첫 번째 호출은 오류를 발생시킵니다.
오버로드된 멤버 함수의 경우 함수의 버전마다 서로 다른 액세스 권한을 부여할 수 있습니다. 이러한 함수는 여전히 바깥쪽 클래스의 범위에 있는 것으로 간주되므로 오버로드된 함수입니다. 멤버 함수 Deposit가 오버로드되는 다음 코드를 살펴보겠습니다. 한 버전은 public이고 다른 버전은 private입니다.
이 샘플의 목적은 입금을 하려면 올바른 암호가 필요한 Account 클래스를 제공하는 것입니다. 이 작업은 오버로드를 사용하여 수행됩니다.
Account::Deposit에서 Deposit에 대한 호출은 private 멤버 함수를 호출합니다. Account::Deposit이 멤버 함수이므로 클래스의 private 멤버에 액세스할 수 있기 때문에 이 호출은 올바릅니다.
// declaration_matching2.cpp
class Account
{
public:
Account()
{
}
double Deposit( double dAmount, char *szPassword );
private:
double Deposit( double dAmount )
{
return 0.0;
}
int Validate( char *szPassword )
{
return 0;
}
};
int main()
{
// Allocate a new object of type Account.
Account *pAcct = new Account;
// Deposit $57.22. Error: calls a private function.
// pAcct->Deposit( 57.22 );
// Deposit $57.22 and supply a password. OK: calls a
// public function.
pAcct->Deposit( 52.77, "pswd" );
}
double Account::Deposit( double dAmount, char *szPassword )
{
if ( Validate( szPassword ) )
return Deposit( dAmount );
else
return 0.0;
}