[C++] C++ 진입 함수 오버로딩

머리말

자연어에서 단어는 여러 의미를 가질 수 있으며 사람들은 문맥을 통해 단어의 진정한 의미를 판단할 수 있습니다.


1. 함수 오버로딩의 정의

함수 오버로딩 : 함수의 특수한 경우입니다. C++에서는 동일한 이름을 가진 여러 함수가 동일한 범위 에서 유사한 함수를 선언할 수 있습니다 . 동일한 이름을 가진 이러한 함수는 다른 형식 매개변수 목록(매개변수 또는 유형의 수 또는 유형의 순서)을 가집니다. , 비슷한 기능을 수행하지만 데이터 유형이 다른 것을 처리하는 데 자주 사용됩니다. 예를 들어:

#include<iostream>
using namespace std;

int Add(int left, int right)
{
    
    
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
    
    
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}
int main()
{
    
    
	int a = Add(1, 2);
	double b = Add(1.1, 2.2);
	cout << a << endl;
	cout << b << endl;

	return 0;
}

여기에 이미지 설명 삽입
우리는 Add 함수가 두 가지 다른 유형의 숫자의 합을 계산하도록 정의되어 있음을 볼 수 있습니다. 호출 프로세스 중에 시스템은 매개변수의 유형에 따라 정확한 호출을 자동으로 실현합니다.

C++에서는 함수를 오버로드할 수 있을 뿐만 아니라 연산자도 오버로드할 수 있습니다. 예를 들어:

연산자 <<,>>. 시프트 연산자와 출력 및 입력 연산자로 사용할 수 있습니다.

2. 함수 오버로딩 조건

1. 다양한 매개변수 유형

int Add(int left, int right)
{
    
    
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
    
    
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}

2. 매개 변수의 수가 다릅니다.

void f()
{
    
    
	cout << "f()" << endl;
}
void f(int a)
{
    
    
    cout << "f(int a)" << endl;
}

3. 매개변수 유형의 순서가 다름

void f(int a, char b)
{
    
    
	cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
    
    
	cout << "f(char b, int a)" << endl;
}

참고: 함수 오버로딩의 반환 유형은 동일하거나 다를 수 있습니다. 다른 반환 유형만으로는 오버로드된 함수가 되기에 충분하지 않습니다. 함수 호출이 반드시 반환 값을 받을 필요는 없기 때문에

3. 함수 오버로딩의 원리 – 이름 맹글링

C++은 함수 오버로딩을 지원하지만 C 언어는 함수 오버로딩을 지원하지 않는 이유는 무엇입니까?
C/C++에서 프로그램이 실행되려면 전처리, 컴파일, 어셈블, 링크 등의 단계를 거쳐야 합니다 .
여기에 이미지 설명 삽입
컴파일 단계에서 컴파일러는 함수 이름을 수정합니다.

  • C언어에서
    여기에 이미지 설명 삽입
    C언어는 단순히 함수 이름만 바꿀 수 있기 때문에 구체적인 방법은 함수 이름 앞에 "_"를 추가하는 것인데, 같은 이름의 함수 두 개를 추가하면 컴파일 후에 같은 함수 이름을 가지게 되고, 호출하면 간혹 어떤 것을 호출해야 할지 모르기 때문에 오류가 발생하므로 C 언어에서는 함수 오버로딩이 지원되지 않습니다.
  • C++에서
    컴파일 단계에서 두 함수의 함수 이름이 동일하더라도 컴파일러는 함수 오버로딩을 형성하는 조건에 따라 함수 이름을 수정 하므로 심볼 테이블 에서 생성된 이름이 다릅니다.
    두 함수에 의해 생성된 심볼 테이블의 이름이 .cpp 파일에서 다르기 때문에 컴파일이 가능합니다.

C++의 수정 규칙은 플랫폼에 따라 다르며 Windows의 VS 수정 규칙은 다소 복잡하지만 Linux의 g++ 수정 규칙은 간단하고 이해하기 쉽습니다.

  • Windows에서
    여기에 이미지 설명 삽입
    ?Add@@YAHHH@Z
    ?시작을 나타냅니다.
    Add는 원래 함수 이름을 나타냅니다.
    @@YA는 매개변수의 시작을 나타냅니다.
    첫 번째 H는 반환 값 유형 int를 나타냅니다
    . 그 뒤의 H는 int 매개변수를 나타냅니다 . M은 float를 나타냅니다. 매개변수
    @Z는 Finish라는 이름을 나타냅니다.

  • 리눅스에서

여기에 이미지 설명 삽입
_Z3Addii
_Z는 시작 부분을 나타냅니다.
3은 원래 함수 이름의 길이를 나타냅니다.
Add는 원래 함수 이름을 나타냅니다.
첫 번째 i는 첫 번째 매개 변수가 int임을 나타냅니다.
두 번째 i는 두 번째 매개 변수가 int임을 나타냅니다.

Linux에서 g++의 함수 수정은 [_Z+함수 길이+함수 이름+타입 이니셜]이 됨을 알 수 있다 .

4. 보충 및 요약

다형성(Polymorphism): 동일한 것을 사용하여 다른 형태를 나타내는 다형성은 다음과 같이 나뉩니다.

  • 정적 다형성(컴파일 타임 다형성);
  • 동적 다형성(실행 시 다형성)

함수 오버로딩은 일종의 정적 다형성입니다.

오버로드된 함수는 일반적으로 동일한 함수 이름을 사용하여 동일한 범위에서 유사한 함수를 가진 함수 그룹의 이름을 지정하는 데 사용되며, 이는 함수 이름의 수를 줄이고 이름 공간의 오염을 방지하며 프로그램의 가독성을 크게 향상시킵니다. .

추천

출처blog.csdn.net/qq_65207641/article/details/128853097