뚜둔뚜둔✩

판다의 개발일지

C · C++

[C++] 함수의 선언과 구현부 분리

2022. 7. 13. 00:36

    선언과 구현부 분리

    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
    {
    }
     

    [C++] 생성자와 초기화 리스트 (Initializer List)

    C++에서 생성자는 어떤 구조체 또는 클래스 객체의 생성 시 자동으로 호출되는 함수이다. 따라서 생성자에서는 흔히 초기화에 필요한 동작을 수행하게 되는데, 이때 멤버 변수를 초기화하는 데

    pandas-are-bears.tistory.com

     

    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에 대한 값이 전달되기를 기대하기 때문에 의도와 다르게 동작하거나 컴파일 에러가 발생하게 된다.

     

    [C++] Default Arguments (Parameters)

    C++에서는 C 언어에서와 달리 default argument를 설정해두면 함수 호출 때 인자를 전달하지 않아도 함수를 호출할 수 있다. #include int add(int a = 123, int b = 321) { return a + b; } int main(void) { std..

    pandas-are-bears.tistory.com

     

    인라인(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