20111212_정적멤버변수/함수, 상수멤버
Programming/C, C++ 2011. 12. 12. 14:20 |정적멤버변수
클래스의 바깥에 선언되어 있지만, 클래스에 속하면서 객체별로 할당되는 게 아닌 모든 객체가 공유하는 멤버.
개별 객체와는 직접적인 상관이 없고 객체 전체를 대표하는 클래스와 관련된 정보를 저장함.
정적멤버변수는 객체와 논리적으로 연결되어 있지만 객체 내부에 있진 않고, 소유 주체 자체가 객체가 아닌 클래스임.
그래서 객체 크기에 정적멤버의 크기는 포함되지 않음.
클래스 내부에 선언된 멤버 변수에 static 키워드를 붙이면 됨.
○ 특징
- 정적멤버변수는 클래스의 모든 인스턴스에 의해 공유된다.
- 정적멤버변수에 자료가 저장되어 값이 유지되는 원리는 전역변수와 동일하다.
○ 사용조건
- 정적멤버변수는 특정 클래스 내부에 선언해야 한다.
- 정적멤버변수는 클래스 밖에서 별도로 초기화해야 한다.
class Count
{
private:
int Value;
static int Num;
public:
Count() { Num++; }
~Count() { Num--; }
void OutNum() {
printf("현재 객체 개수 = %d\n", Num);
}
};
int Count::Num=0;
정적멤버함수
정적멤버변수랑 비슷한 개념.
객체와 직접적으로 연관된다기보단 클래스와 연관되며
생성된 객체가 하나도 없더라도 Class::func() 형식으로 호출할 수가 있고, 클래스 전체에 대한 전반적인 작업을 한다.
주로 정적멤버변수를 조작하거나, 이 클래스에 속한 모든 객체를 위한 어떠한 처리를 하는 역할을 함.
클래스 내부에 선언된 멤버 함수에 static 키워드를 붙이면 됨.
○ 특징
- 정적멤버함수는 this 레퍼런스를 사용할 수 없다
- 정적멤버함수에서는 인스턴스 변수를 사용할 수 없다.
- 정적멤버함수는 오버라이딩되지 않는다.
좀 기분나쁜 건 이런 게 허용된다.
Count *pC;
pC->OutNum(); // 생성 전에도 호출 가능
pC = new Count;
pC -> OutNum(); // 생성 후에도 호출 가능
delete pC;
pC -> OutNum(); // 파괴 후에도 호출 가능
정적멤버함수는 특정한 객체에 의해 호출되는 것이 아니므로 숨겨진 인수 this가 전달되지 않는다.
클래스에 대한 작업을 하기 때문에 어떤 객체가 자신을 호출했는 지 구분할 필요가 없으며, 따라서 호출한 객체에 대한 정보도 필요없다.
그래서 정적 멤버 함수는 정적 멤버만 액세스할 수 있으며, 일반 멤버는 참조할 수 없다.
왜냐하면 일반 멤버 앞에는 암시적으로 this->가 붙는데 정적 멤버 함수는 this를 전달받지 않기 때문이다.
정적멤버함수인 InitNum에서 비정적 멤버인 Value를 참조하는 것은 불가능하다.
상수멤버
상수멤버 : 한 번 값이 정해지면 변경될 수 없는 멤버.
클래스 전체에서 참조하는 중요한 상수가 있다면 이를 상수 멤버로 정의하여 클래스에 포함시킬 수 있음.
생성자의 초기화 리스트로만 초기화할 수 있다.
참고
http://www.winapi.co.kr
http://mp3119.tistory.com/25
'Programming > C, C++' 카테고리의 다른 글
20111215_구조체, 상속성 (0) | 2011.12.15 |
---|---|
20111212_C 기초부터 정리하긔 (0) | 2011.12.12 |
20111209_(c++)friend 함수, this 포인터 (0) | 2011.12.09 |
20111208_이것저것 (0) | 2011.12.08 |
20111208_배열과 포인터, 동적배열 할당 (0) | 2011.12.08 |