숏컷 코드
void print(int n) { std::cout << "int: " << n << "\n"; }
void print(double d) { std::cout << "double: " << d << "\n"; }
void print(const std::string& s){ std::cout << "str: " << s << "\n"; }
print(42); // int 버전 호출
print(3.14); // double 버전 호출
print("hello"); // string 버전 호출같은 이름이라도 매개변수 타입과 개수가 다르면 다른 함수입니다. 오버로딩은 반환 타입이 아니라 호출 인자로 구분된다고 먼저 잡으면 됩니다.
문법
함수 오버로딩 카드에서 먼저 다시 보는 기본형은 아래입니다.
- 일반 함수 정의:
return_type name(params) { ... } - 같은 이름의 다른 시그니처:
void f(int)/void f(double) - 반환 타입만 다른 함수: 오버로딩 불가
- 모호한 변환: 호출 쪽에서 더 구체적으로 적어야 함
int square(int x) { return x * x; }
double square(double x) { return x * x; }
int a = square(3);
double b = square(3.5);컴파일러는 "가장 잘 맞는" 오버로드를 고른다
C++는 함수 이름이 같아도 매개변수 타입·개수가 다르면 다른 함수로 취급합니다. 컴파일러는 호출 시점 인자를 보고 가장 잘 맞는 오버로드를 선택합니다. 우선순위는 정확한 타입 일치 > 승격(promotion) > 표준 변환 > 사용자 정의 변환 순입니다.
void f(int x) { std::cout << "int\n"; }
void f(double x) { std::cout << "double\n"; }
f(1); // int 정확 일치 → f(int)
f(1.0); // double 정확 일치 → f(double)
f(1.0f); // float → double 승격 → f(double)
f('a'); // char → int 승격 → f(int)반환 타입만 다른 두 함수는 컴파일 오류입니다. 호출 시점에는 인자 정보로만 함수를 고르기 때문에, 반환 타입만 바꾸는 방식은 계약이 되지 못합니다.
// ❌ 반환 타입만 다름 — 컴파일 오류
int getValue() { return 1; }
double getValue(int base) { return static_cast<double>(base); }// ✅ 매개변수 타입이나 개수를 바꿔야 오버로딩이 된다
int parse(const std::string& s) { return std::stoi(s); }
double parse(const std::string& s, int /*base*/) { return std::stod(s); }모호한 변환은 호출 쪽을 더 분명히 적는다
두 오버로드가 같은 변환 비용으로 일치하면 컴파일러는 모호성 오류를 냅니다.
void g(long x) { }
void g(double x) { }
g(1); // ❌ int→long 과 int→double이 동등 — 모호성 오류
g(1L); // ✅ long 버전
g(1.0); // ✅ double 버전선택 기준
- 구분 기준은 매개변수 타입과 개수
- 반환 타입만 바꾸는 것은 오버로딩이 아님
- 정확한 일치가 가장 우선
- 승격과 암묵 변환이 섞이면 모호해질 수 있음
- 호출이 애매하면 호출 쪽 타입을 더 분명히 적는다
주의할 점
const char* 인자가 bool 오버로드로 해결될 수 있습니다. 문자열 리터럴을 받으려면 const char*나 std::string_view 쪽 오버로드를 같이 준비하는 편이 안전합니다.
void process(bool b) { std::cout << "bool\n"; }
void process(const std::string& s) { std::cout << "string\n"; }
process("hello"); // ❌ const char* → bool 변환이 끼어들 수 있음
// ✅ 문자열 리터럴 경로를 직접 받는다
void process(const char* s) { process(std::string{s}); }
process("hello");참고 링크
1 sources