본문 바로가기
IT 컴퓨터_프로그램 /c++

static

by 건축직일상 2015. 10. 6.

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

}

 CObj    obj2;

for(int i = 0; i < 10; ++i)

{

obj2.Render2(); // 10 ~19 출려됨

}

 CObj    obj3;

for(int i = 0; i < 10; ++i)

{

obj3.Render2(); // 20 ~29 출려됨

}

 obj3.m_iStatic = 40; // 이런식의 대입은 안된다
//여러개의 객체가 생성이 되었지만 정적멤버변수인 iStatic 이 계속해서 공유가 된다

}

/////////////////////////////////////////////////////////////////////////////////


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;)

생성자에서는 초기화가 불가능하다 



'IT 컴퓨터_프로그램 > c++' 카테고리의 다른 글

클래스_상속  (0) 2015.10.12
깊은복사 얕은복사  (0) 2015.10.06
함수 오버로딩  (0) 2015.10.05
const  (0) 2015.10.05
클래스2  (0) 2015.10.01

댓글