숏컷 코드
cpp
// 선언에서만 기본값 지정 (헤더)
void log(const std::string& msg,
int level = 0,
bool flush = false);
// 정의에서는 기본값 없음 (.cpp)
void log(const std::string& msg, int level, bool flush) { ... }
log("error", 2, true); // 모든 인자 전달
log("warning", 1); // flush = false (기본값)
log("info"); // level = 0, flush = false문법
오른쪽부터 기본값을 줘야 하는 이유
기본 인자는 반드시 오른쪽부터 연속으로 지정해야 합니다. 중간에 기본값이 없는 인자가 있으면 그 뒤의 인자를 어떻게 전달할지 알 수 없기 때문입니다.
cpp
// ❌ 중간 인자에 기본값 없음 — 컴파일 오류
void f(int a = 0, int b, int c = 0) { }
// ✅ 오른쪽부터 연속
void f(int a, int b = 10, int c = 20) { }
f(1); // a=1, b=10, c=20
f(1, 2); // a=1, b=2, c=20
f(1, 2, 3); // a=1, b=2, c=3기본값은 선언(헤더)에서만
기본값은 함수 선언에서 한 번만 지정합니다. 정의(.cpp)에서 다시 지정하면 컴파일 오류입니다. 헤더에서 기본값이 보여야 호출자가 기본값을 알 수 있습니다.
cpp
// utils.h
void connect(const std::string& host, int port = 8080, int timeout = 30);
// utils.cpp
// ❌ 정의에서 기본값 다시 지정 — 오류
// void connect(const std::string& host, int port = 8080, int timeout = 30) { }
// ✅ 정의에서는 기본값 없이
void connect(const std::string& host, int port, int timeout) {
// port == 8080, timeout == 30 (기본 호출 시)
}기본 인자 vs 오버로딩
둘 다 "인자를 줄여서 호출"하는 효과지만 목적이 다릅니다. 기본 인자는 같은 동작에서 선택 옵션을 줄 때, 오버로딩은 타입이나 동작 자체가 다를 때 씁니다.
cpp
// 기본 인자 — 같은 동작, 일부 인자 선택
void draw(int x, int y, int size = 10, int color = 0xFFFFFF);
// 오버로딩 — 타입에 따라 다른 동작
void draw(Circle c);
void draw(Rectangle r);체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 같은 동작, 일부 인자 생략 가능 | 기본 인자 |
| 타입이나 동작 자체가 다름 | 오버로딩 |
| 기본값 위치 | 헤더 선언에서만 (정의 아님) |
| 기본값 지정 방향 | 오른쪽부터 연속 |
주의할 점
기본 인자와 오버로딩을 함께 쓰면 모호성 오류가 발생할 수 있습니다.
cpp
void f(int a, int b = 0) { }
void f(int a) { } // ❌ f(1) 호출 시 모호성 오류
// 위 두 함수 정의 후:
f(1); // ❌ f(int) 인지 f(int, int=0) 인지 모호
// ✅ 기본 인자와 오버로딩을 같이 쓰지 말 것
// 하나의 방식만 선택참고 링크
1 sources