#include <iostream>
int Example1(int param = 10) {
int result = param * 2;
return result;
}
// 함수의 선언부
// 선언부에서는 매개변수의 이름을 생략할 수 있다.
int Example2(int = 10);
int Example2(int param) {
int result = param * 2;
return result;
}
// 매개변수가 두 개일 경우
int Example3(int param1, int param2 = 10) {
int result = param1 * param2;
return result;
}
// 매개변수가 네 개일 경우
int Example4(int param1, int param2, int param3 = 10, int param4 = 10) {
int result = param1 * param2 * param3 * param4;
return result
}
int main(int argc, char* argv[]) {
std::cout << Example1() << std::endl;
std::cout << Example1(10) << std::endl;
std::cout << Example2() << std::endl;
std::cout << Example2(10) << std::endl;
std::cout << Example3(10) << std::endl;
std::cout << Example3(10, 5) << std::endl;
std::cout << Example4(10, 20) << std::endl;
std::cout << Example4(10, 20, 30) << std::endl;
std::cout << Example4(10, 20, 30, 40) << std::endl;
return 0;
}
"모호성에 의해 문제가 발생할 여지가 있다."보다는
"함수의 오버로딩을 다중 정의와 디폴트 값을 사용해 구현할 수 있으며, 둘은 양립할 수 없다."로 기억하는게 좋지 않을까? 그냥 내 생각임..
template <typename T>
반환형식 함수이름(매개변수) {
수행 작업
}
// 호출부
함수이름<타입>(매개변수);
or
함수이름(매개변수);
그냥 제네릭이라고 이해하면 될것같다.
타입이 특정 연산을 지원하지 경우에는 어떻게 대응할 수 있는가?
namespace 이름
{
// 네임스페이스의 시작
~~~
// 네임스페이스의 끝
}
#include <iostream>
namespace TEST {
int num = 10;
void addNum(int n = 0) {
num += n;
}
}
int main(int argc, char* argv[]) {
std::cout << TEST::num << endl;
std::cout << TEST::addNum(10) << endl;
std::cout << TEST::num << endl;
return 0;
}
::
)를 이용해 네임스페이스를 기술할 수 있다.using
예약어를 통해 네임스페이스를 생략할 수 있다.using namespace 네임스페이스이름;