[C++ Essence Shop] 2. C++ 시작을 위한 기본 매개변수 및 함수 오버로딩

목차

1. 기본 매개변수(기본 인수)

1.1 전장성

1.2 준기본값

1.3 기본 매개변수를 사용한 함수 선언 및 정의

2. 함수 오버로딩

2.1 함수 오버로드 판단

2.2 함수 오버로딩의 원리 - 함수 이름 수정 규칙


1. 기본 매개변수(기본 인수)

        일부 함수가 정의되면 기본 매개변수 또는 기본 실제 매개변수라고 하는 형식 매개변수 목록에 초기 값을 할당합니다. 기본 매개변수를 사용하여 함수를 호출할 때 실제 매개변수를 생략할 수도 있고 생략할 수도 있으며, 생략하면 기본적으로 기본 실제 매개변수가 리터럴 값으로 사용됩니다. (기본값은 상수 또는 전역변수여야 합니다)

#include<iostream>
using namespace std;

void print(int a = 0,int b = 1)
{
	cout << a << ' ' << b << endl;
}

int main()
{
	print();
	return 0;
}

출력 결과:

0 1 

이상에서 완전기본(full default)과 준기본(semi-default)의 개념을 다음과 같이 소개하였다.

1.1 전장성

        이름에서 알 수 있듯이, 전체 기본값은 형식 매개변수 목록의 모든 형식 매개변수에 기본 실제 매개변수를 제공하는 것이며 호출 시 실제 매개변수를 생략할 수 있습니다. 그러나 생략할 경우 컴파일러에 모호함을 유발하고 오류를 유발하는 것을 방지하기 위해 오른쪽에서 왼쪽으로만 생략 할 수 있습니다.

void print(int a = 1, int b = 1, int c = 1)
{
	cout << a << ' ' << b << ' ' << c << endl;
}
int main()
{
	print(0, 0, 0);
	print(0, 0);
	print(0);
	print();
	return 0;
}

1.2 준기본값

        부분 기본값은 실제로 일부 매개변수에 기본 실제 매개변수를 할당하는 부분 기본값이지만 기본값을 설정할 때 따라야 할 규칙이 있습니다. 기본 매개변수 오른쪽에 있는 모든 형식 매개변수에는 기본 매개변수가 있어야 합니다.

void print(int a = 1, int b = 1, int c = 1);
void print(int a, int b = 1, int c = 1);
void print(int a, int b, int c = 1);

1.3 기본 매개변수를 사용한 함수 선언 및 정의

        기본 매개변수를 사용하여 함수를 선언할 때 정의와 선언이 분리된 경우 기본 매개변수를 선언부에 작성해야 한다는 점에 유의해야 합니다.

void print(int a = 1, int b = 1, int c = 1);
void print(int a, int b, int c){}

2. 함수 오버로딩

2.1 함수 오버로드 판단

        함수 오버로딩은 C++의 특수 구문으로, 유사한 함수를 가진 동일한 이름의 여러 함수를 동일한 범위에서 선언할 수 있도록 하며, 유사한 함수를 구현하지만 유형이 다른 문제를 처리합니다. (단, 함수의 반환형은 함수 오버로딩의 판단 조건으로 사용되지 않는다는 점에 유의하시기 바랍니다 )

int add(int a,int b)
{
	return a + b;
}
double add(double a, int b)
{
	return a + b;
}
double add(int a, double b)
{
	return a + b;
}

2.2 함수 오버로딩의 원리 - 함수 이름 수정 규칙

        우리 프로그램의 링크 단계에서 링커는 함수의 주소를 지정하지만 오버로드된 함수는 동일한 함수 이름을 가지며 링커는 어떤 함수가 호출되는지 알 수 없으므로 컴파일러는 오버로드된 함수의 함수 이름을 수정합니다. 컴파일러마다 수정 규칙이 다릅니다.Windows에서 VS의 함수 이름 수정 규칙은 더 복잡하고 이해하기 쉽지 않은 반면, Linux의 함수 이름 수정 규칙(_Z+함수 이름 길이+함수 이름+형식 매개 변수 유형 이니셜 문자 ) 비교적 간단하고 이해하기 쉽기 때문에 Linux를 예로 들어 설명하겠습니다.

         위 그림을 잘 비교해 보면 Linux에서는 gcc가 오버로드된 함수의 함수 이름을 수정하고 수정된 이름에 함수 매개변수의 유형 정보를 추가하며 호출 명령도 수정된 함수 이름을 따르는 것을 알 수 있습니다.

추천

출처blog.csdn.net/qq_64293926/article/details/132087822