선언과 구현부 분리
C++ 클래스의 멤버 함수는 클래스 안에서 구현될 수도 있고, 또는 클래스 내부에는 멤버 함수의 선언만 되고 클래스 외부에서 구현될 수 있다.
(1) 클래스 내부 멤버 함수 구현
// Point.h
class Point
{
private:
int x;
int y;
public:
int getX(void) { return x; }
}
※ 클래스 내부 구현된 함수는 인라인(inline) 함수 취급되는 특징이 있다.
(2) 클래스 멤버 함수의 선언과 구현부 분리
// Point.h
class Point
{
private:
int x;
int y;
public:
int getX(void);
}
// Point.cpp
int Point::getX(void)
{
return x;
}
분리된 구현부는 위의 예시에서 볼 수 있듯이 return_type class_name::function_name(params)
형식을 따른다.
생성자의 구현부 분리
클래스의 생성자 및 소멸자 역시 구현부를 분리할 수 있는데, 이들은 함수 선언 시 리턴 타입 자체를 표기하지 않아야 한다는 제약이 있다. 따라서 마찬가지로 분리된 구현부에서도 리턴 타입을 표시하지 않아야 한다.
// Point.h
class Point
{
private:
int x;
int y;
public:
Point();
}
// Point.cpp
Point::Point()
{
x = 0;
y = 0;
}
초기화 리스트
생성자의 초기화 리스트는 선언이 아닌 구현부에 작성한다.
// Point.h
class Point
{
private:
int x;
int y;
public:
Point(int x_val, int y_val);
}
// Point.cpp
Point::Point(int x_val, int y_val)
: x(x_val), y(y_val) // initializer list
{
}
Default Argument
함수의 선언과 구현부를 분리했을 때 default argument는 선언에만 default 값을 표시한다.
// Point.h
class Point
{
private:
int x;
int y;
public:
Point(int x_val = 0, int y_val = 0); // default argument
}
// Point.cpp
Point::Point(int x_val, int y_val)
: x(x_val), y(y_val)
{
}
Default argument는 선언에 표시되어야 하는 이유는 컴파일러가 함수 호출 시 헤더 파일의 함수 선언을 기준으로 문법적으로 올바른 함수 호출이 이뤄졌는지 검사하기 때문이다. 만약 선언부에 default 값이 표시되지 않는다면 컴파일러는 모든 argument에 대한 값이 전달되기를 기대하기 때문에 의도와 다르게 동작하거나 컴파일 에러가 발생하게 된다.
인라인(Inline) 멤버 함수의 구현부 분리
인라인 멤버 함수는 클래스 내부 구현된 함수이지만, 인라인 멤버 함수 역시 마찬가지로 선언과 구현부를 분리할 수 있다. 단, 구현부를 분리할 때에는 함수의 선언 또는 구현부에 inline
키워드를 표시해주어야 한다.
// Point.h
class Point
{
private:
int x;
int y;
public:
int getX(void);
}
inline int Point::getX(void)
{
return x;
}
References
・ https://www.ibm.com/docs/en/i/7.2?topic=only-inline-member-functions-c
'C · C++' 카테고리의 다른 글
[C++] 함수 오버로딩(Overloading) (0) | 2022.07.23 |
---|---|
[C++] Default Arguments (Parameters) (0) | 2022.07.16 |
[C++] 생성자와 초기화 리스트 (Initializer List) (0) | 2022.05.26 |
[C++] 초기화 (Initialization) (0) | 2022.05.25 |
[C++] 구조체(struct)와 클래스(class) (2) | 2022.05.15 |