-
Notifications
You must be signed in to change notification settings - Fork 2
2014 06 11 in class 멤버 초기화, 포워드 선언, const 메서드
krikit edited this page Nov 26, 2014
·
1 revision
기존에는 static const 멤버에 한해 클래스 내부에서 초기화가 가능했습니다.
class MyClass {
public:
int num = 0; // 멤버 변수로 불가
static int stat_num = 1; // const가 아니므로 불가
const int const_num = 2; // static이 아니므로 불가
static const int NUM; // 가능
};
그러나 C++11에서는 이러한 제약이 풀리고 모든 경우에 초기화가 가능해 졌습니다.
클래스를 정의할 때 다른 클래스의 포인터나 참조만을 사용하고 다른 클래스 객체의 멤버에 접근할 필요가 없을 경우 다른 클래스가 정의되어 있는 헤더를 include하기 보다 포워드 선언을 하는 것이 좋습니다. 이는 헤더 간에 상호 의존성이 존재하는 경우에도 무리 없이 빌드가 되도록 해줍니다.
#include "YourClass.h" // 필요 없음
class YourClass; // 포워드 선언
class MyClass {
private:
YourClass* your_obj;
};
어떤 메서드를 호출하면 그 객체의 값이 변하지 않는다는 일종의 표시로 메서드 선언부의 맨 뒤에 const 키워드를 사용합니다.
class MyClass {
public:
int get_num() const;
void set_num(int val);
private:
int num;
};
void MyClass::get_num() const {
++num; // const 메서드 안에서 멤버를 변경하려 했으므로 컴파일 에러
}
int main(int argc, char** argv) {
const MyClass& my_ref;
my_ref.set_num(0); // const 참조자로 멤버가 변경되는 메서드를 호출하므로 컴파일 에러
return 0;
}
그러나, 어떤 멤버는 변경이 일어나더라도 외부에서는 의미가 없어서 const 메서드에서 멤버를 변경해 주고 싶은 경우가 있습니다. 예를 들어, 위의 코드에서 get_num() 메서드를 몇 번 호출했는 지 알아보기 위한 카운터를 둘 때와 같은 상황입니다. 이럴 때 사용하는 것이 mutable 키워드 입니다.
class MyClass {
public:
int get_num() const;
private:
int num;
mutable int cnt; // mutable 멤버
};
int MyClass::get_num() const {
++cnt; // mutable 멤버는 const 메서드 내에서도 변경 가능
return num;
}