static 정적. 고정된 , 정지상태
정적 - 컴파일타임에 결정
동적 - 런타임에 결정 (dynamic)
void Render(void)
{
int iTemp = 0;
cout << iTemp << endl;;
++iTemp;
}
void Render2(void)
{
static int iStatic = 0;
cout << iStatic << endl;
++iStatic;
//전역변수와 비슷한 특징이있다
//메모리 공간을 할당받고 초기화가 일어나면 프로그램이 종료될때 까지 소멸이 안된다.
//다시 초기화가 일어나지도 않는다
//전역변수와는 다르게 중괄호 내부에서만 접근할수있다.
}
int g_Test = 0; //전역변수
void Render3(void)
{
cout << g_Test << endl;
++g_Test;
}
void main(void)
{
for(int i = 0; i < 10; ++i)
{
Render(); // 0만 나온다
Render2(); // 0~9까지 나온다
Render3(); // 0~9 까지 나온다
}
iStatic = 20; // 이런식의 제정의는 안된다
}
////////////////////////////////////////////////////////////////////
//정적멤버변수를 가지고있는 클래스
class CObj
{
private:
static int m_iStatic; // 어떤객체 이든지 공유가된다
int m_iTest;
public:
void Render(void)
{
cout << m_iTest++ << endl;
}
void Render2(void)
{
cout << m_iStatic++ endl;
}
public:
CObj(void):miTest(0){;}
~CObj(void){;}
};
int CObj::m_iStatic = 0;
//프로그램이 시작될때 메모리에 등록이 되어야되기때문에 클래스내부에 정적멤버를 이런식으로 초기화한다
void main(void)
{
CObj obj;
for(int i = 0; i < 10; ++i)
{
obj.Render(); // 0 ~9 출려됨
}
for(int i = 0; i < 10; ++i)
{
obj.Render2(); // 0 ~9 출려됨 static
}
for(int i = 0; i < 10; ++i)
{
obj2.Render2(); // 10 ~19 출려됨
}
for(int i = 0; i < 10; ++i)
{
obj3.Render2(); // 20 ~29 출려됨
}
}
/////////////////////////////////////////////////////////////////////////////////
class CTest
{
private:
public:
void Render(void)
{
cout << "CTest Render" << endl;
}
void Render2(void)
{
cout << "Static CTest Render" << endl;
}
};
void main(void)
{
CTest test;
test.Render(); //ctest render
CTest::Render(); // 에러가난다
CTest::Render2(); //객체가 없어도 정적함수는 해당클래스에 접근해서 출력이 가능하다
}
static 멤버
클래스변수 , 클래스 함수
메인함수 호출이전에 메모리에 등록이 되어 초기화가 된다 (이점은 전역변수와 동일)
선언된 클래스에 객체 내부에서 공유가된다. 정적변수 초기화 문장을 통해서 초기화가 가능하다 ( int CObj::m_iStatic = 0;)
생성자에서는 초기화가 불가능하다
댓글