출처: 윤성우의 열혈 C++ 프로그래밍
static 멤버변수는 '클래스 변수'라고도 한다. 일반적인 멤버변수와 달리 클래스당 '하나'씩만 생성되기 때문이다.
위의 코드에 선언된 static 변수 simObjCnt는 SoSimple 객체가 생성될 때 마다 함께 생성되어 객체별로 유지되는 변수가 아님.
객체의 생성 갯수와 관계없이 메모리 공간에 딱 '하나'만 할당되어 공유되는 변수.
즉, SoSimple sim1,2,3 ... 등과같이 객체가 아무리 많이 생성된다 한들 이들이 공유하는 static 변수는 오직 하나이다.
따라서 각 객체의 멤버함수(생성자)에서는 simObjCnt에 멤버변수에 접근하듯이 접근 가능.
하지만 그렇다고 해당 객체 내에 simObjCnt(static 변수)가 존재하는것은 아니고 위치는 객체 외부에 있고 다만 객체에게 멤버변수처럼 접근할 수 있는 권한을 줬을 뿐이다.
#include <iostream>
using namespace std;
class SoSimple
{
private:
static int simObjCnt; // static 멤버변수, 클래스변수
public:
SoSimple()
{
simObjCnt++;
cout << simObjCnt << "번째 SoSimple 객체 " << endl;
}
};
int SoSimple::simObjCnt = 0; // static 멤버변수의 초기화!
class SoComplex
{
private:
static int cmxObjCnt;
public:
SoComplex()
{
cmxObjCnt++;
cout << cmxObjCnt << "번째 SoComplex 객체" << endl;
}
SoComplex(SoComplex ©)
{
cmxObjCnt++;
cout << cmxObjCnt << "번째 SoComplex 객체" << endl;
}
};
int SoComplex::cmxObjCnt = 0;
int main(void)
{
SoSimple sim1;
SoSimple sim2;
SoComplex cmx1;
SoComplex cmx2 = cmx1;
SoComplex();
return 0;
}
static 멤버함수역시 static 멤버변수와 동일.
-> static 멤버함수는 객체의 멤버가 아니므로 애초에 클래스의 멤버변수에 접근하는것이 불가.
정리: static 멤버함수 내에서는 static 멤버변수와 static 멤버함수만 호출가능.
mutable