반응형
Default Parameters
- 함수 호출시 인자 전달을 생략하면 기본값이 적용된다.
- 주의 사항
- 함수의 마지막 파라미터부터 역순으로만 지정 가능
- 헤더파일로 분리된 함수의 경우 선언에만 기본값을 정의 한다.(구현부
// 선언부, 구현부 분리 시 선언부에만 기본 파라미터 정의
void func1(int x, int y = 0, int z = 0);
// 구현부 가독성을 위해서 필요시 주석으로 표현
void func1(int x, int y /*= 0 */, int z /*= 0 */)
{
}
int main()
{
func1(1, 1, 1); // 파라미터 기본값 사용 안함
func1(1, 1); // 파라미터 기본값 z 사용
func1(1); // 파라미터 기본값 y, z 사용
}
Function Overloading
- 인자의 개수나 타입이 다르면 동일 이름의 함수를 2개 이상 만들 수 있음
- 사용자 입장에서 일관된 함수를 제공 가능
- 주의사항
- 디폴트 값이 있는 함수에서는 주의 필요
- 리턴 타임만 다른 경우는 오버로딩 불가
int square(int a)
{
return a * a;
}
double square(double a)
{
return a * a;
}
int main()
{
square(1); // 정수 파라미터 함수 호출
square(1.1); // 실수 파라미터 함수 호출
}
Inline Function
- 함수 호출 시 실제 함수로 이동하지 않고 함수의 기계어 코드로 치환함
- 장점 : 빠름
- 단점 : 치환되는 함수가 클 경우 목적코드(실행파일)이 커질 수 있음
- 인라인 상태 확인 방법
- cl : 이름.cpp /FAs /Ob1 -> 이름.asm
- g++ : 이름.cpp -S -02 -> 이름.s
- 헤더파일에 구현부를 제공하여야 함
int add1(int a, int b)
{
return a + b;
}
inline int add2(int a, int b)
{
return a + b;
}
int main()
{
int a = 1, b = 2;
int n1 = add1(a, b); // 어샘블리어로 변환 시 함수 호출
int n2 = add2(a, b); // 어샘블리어로 변환 시 함수자체로 치환
}
Template Function
- 실제 함수가 아닌 함수를 만들어 내는 틀(template)
- 사용자가 템플릿을 호출하는 코드를 보고 컴파일러가 필요한 타입의 함수를 생성
- 템플릿 인자 표기는 "typename" 또는 "class"를 사용
- 함수 뿐 아니라 구조체(or 클래스)도 템플릿으로 만들수 있음
- 잘못 사용시 코드 메모리가 커질 수 있음(Code Bloat 현상)
// 함수를 만들어 내는 틀
template<typename T>
T square(T a)
{
return a * a;
}
int main()
{
square<int>(3); // int square(int) 함수 생성
square<double>(3.3); // double square(double) 함수 생성
square(3); // 생략시 타입 추론으로 int square(int) 함수 생성
square(3.3); // 생략시 타입 추론으로 double square(double) 함수 생성
}
template<typename T>
struct Point
{
T x;
T y;
};
int main()
{
Point<int> p1; // 멤버가 int인 Point 구조체 생성
p1.x = 3;
Point<double> p2; // 멤버가 double인 Point 구조체 생성
p2.x = 3.3;
}
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ new (0) | 2019.05.06 |
---|---|
C++ 함수 특징 #2 (0) | 2019.05.05 |
C++ 제어문(if, switch)과 반복문(for) (0) | 2019.01.16 |
C++ 변수의 특징(variable) #2 (0) | 2019.01.15 |
C++ 변수의 특징(variable) #1 (0) | 2019.01.14 |