본문 바로가기

고급C,C++

클래스와 static멤버, 클래스 상수 정의

const char * const Name = "feelpass";
const std::string Name("feelpass");



#include <iostream>
using namespace std;

class Person 
{
char name[20];
int age;
static int count;
public:
Person(char* _name, int _age)
{
strcpy(name, _name);
age = _age;
cout << count << "번째 Person 객체 생성" << endl;
}

void showdata()
{
cout << "이름: " << name << endl;
cout << "나이: " << age << endl;
}
};

const int Person::count = 1;

int main()
{
Person p1("Lee" , 13);
Person p2("Hong", 22);
cin.get();
return 0;
}

위와 같이 한 클래스 내에서만 사용할 수 있는 전역 변수 count를 사용할 수 있다.

int Person::count = 1; 문장을 다시 봐야하는데 count가 private 영역에 선언되어 있으므로 일반적이라면 에러를 검출할 것이다. 하지만 전역변수로 등록이 되었기 때문에 처음 초기화에 대해선 오류를 발생시키지 않고 정상적인 프로그램이 된 것이다. 

실질적으로 class내에 선언된 static 변수가 객체의 멤버로 존재하는 것은 아니라고 한다. 다만 클래스내에서만 직접 접근할 수 있는 권한이 부여된 것이라고 볼 수 있다. 




이제 한 클래스 내에서 사용할 클래스 상수 정의 를 보자



#include <iostream>
using namespace std;

class Person 
{
char name[20];
int age;
static const int count; // 정의 부분을 없에고 static const int count = 1 로 해도 된다.
public:
Person(char* _name, int _age)
{
strcpy(name, _name);
age = _age;
cout << count << "번째 Person 객체 생성" << endl;
}

void showdata()
{
cout << "이름: " << name << endl;
cout << "나이: " << age << endl;
}
};

const int Person::count = 1;//정의부분.

int main()
{
Person p1("Lee" , 13);
Person p2("Hong", 22);
cin.get();
return 0;
}



다른 방법으론 나열자 둔갑술이 있다.

class GamePlayer{
private:
   enum { NumTurns = 5 };
   int scores[NumTurns];
}
선언한 정수 상수를 가지고 다른 사람이 주소를 얻는다든지 참조자를 쓴다는지 하는 것이 싫다면 enum이 아주 좋은 자물쇠가 될 수 있다.