Notice
Recent Posts
Recent Comments
NeuroWhAI의 잡블로그
[C++] 기본 인수(Default arguments) 고급 본문
C++을 오래전 처음 배우면서 기본 인수(혹은 디폴트 매개변수, 기본 매개변수)라는 문법을 봤었고
"음 간단하네"라고 생각하며 자주 사용해왔었습니다.
그러나 오늘 어떤 글을 보게 되었고 기본 인수 문법에 대한 이해도가 더 오르게 되었습니다.
정리하고자 글을 씁니다.
int sum(int a, int b = 2)
{
return a + b;
}
int main()
{
cout << sum(1, 2) << endl;
cout << sum(1) << endl;
return 0;
}
위 코드가 흔한 기본 인수 문법의 예시이고 다들 이렇게만 사용했을겁니다.
(사실 아래의 내용은 지식으로서만 알아두시고 이렇게만 사용하는게 좋을 것 같긴 합니다)
그러나 아래 코드를 봅시다.
int sum(int a, int b)
{
return a + b;
}
int main()
{
cout << sum(1, 2) << endl;
int sum(int a, int b = 2);
cout << sum(1) << endl;
int sum(int a = 1, int b);
cout << sum() << endl;
return 0;
}
이런 용례를 처음 보시면 당황스러울 수 있지만 찬찬히 보면 바로 이해할 순 있습니다.
보면 마치 기본 인수를 '추가'하는 듯한 모습이고 실제로도 그렇게 되어 출력은 전부 3이 나오게 됩니다.
이미 기본 인수가 추가된 인자(파라미터)에는 다시 기본 인수를 설정할 수 없지만 스코프가 다르다면 가능합니다.
그 내용은 마지막에 다루겠습니다.
이번엔 아래 코드를 봅시다.
int sum(int a, int b)
{
return a + b;
}
int g_val = 2;
int foo(int f = sum(1, g_val))
{
return f * f;
}
int main()
{
cout << foo() << endl;
g_val = 1;
cout << foo() << endl;
return 0;
}
결과는 9, 4입니다.
즉, 기본 인수 표현식은 함수를 호출할때 실행된다는 것입니다.
마지막으로 첫 코드의 확장판(?)으로 글을 마치겠습니다.
int sum(int a, int b)
{
return a + b;
}
int sum(int a, int b = 2); // #1
void foo()
{
// int sum(a = 1, int b);
// Error! #1에서 b에는 기본 인수를 지정해줬으니 될거라고 생각할 수 있지만
// 스코프가 다르면 선언시의 기본 인수를 취득해오지 않는다.
cout << sum(1) << endl; // 3: #1
// 호출시의 기본 인수는 스코프가 다른 곳에서도 취득해올 수 있다.
int sum(int a = 1, int b = 3); // #2
// #1에서 b에 기본 인수가 있지만 #1과 #2는 선언된 스코프가 다르므로 문제 없음.
cout << sum() << endl; // 4: #2
// int sum(int a, int b = 4);
// Error! 같은 스코프에 있는 #2에서 이미 b에 기본 인수를 지정했음.
}
int sum(int a = 4, int b); // #3
void bar()
{
cout << sum() << endl; // 6: #1 + #3
int sum(int a, int b);
// cout << sum() << endl;
// Error! 기본 인수가 재정의 되었으므로 a, b에 기본 인수가 없는 상태.
int sum(int a = 5, int b = 6); // #4
cout << sum() << endl; // 11: #4
}
int main()
{
foo();
bar();
return 0;
}
'개발 및 공부 > 언어' 카테고리의 다른 글
[Rust] in/exclusive range expression and pattern (0) | 2018.08.25 |
---|---|
[C++] std::void_t를 이용해 클래스에 특정 멤버가 있는지 확인하기. (0) | 2018.08.05 |
[Kotlin] 헬로, 코틀린! (0) | 2018.08.04 |
[Rust] Auto-Dereferencing Rules (자동 역참조 규칙) (0) | 2018.07.27 |
[Rust] &mut T -> &T 변경하기 (0) | 2018.07.27 |
Comments