static
2022. 4. 10. 12:35ㆍC++
c에서의 static
- 전역변수에 선언된 static
- 선언된 파일 내에서만 참조를 허용
- 함수 내에 선언된 static
- 한번만 초기화 되고, 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다.
#include <iostream>
using namespace std;
void Counter()
{
static int cnt;
cnt++;
cout<<cnt;
}
int main(void)
{
for(int i = 0; i <10; i++)
Counter(); // 12345678910 출력
return 0;
}
전역변수가 필요한 상황
#include <iostream>
using namespace std;
int simObjCnt = 0; // SoSimple 클래스를 위한 전역변수
int cmxObjCnt = 0; // Socomplex 클래스를 위한 전역변수
class SoSimple
{
public:
SoSimple();
};
class SoComplex
{
public:
SoComplex();
SoComplex(SoComplex ©);
};
int main(void){
SoSimple sim1;
SoSimple sim2;
SoComplex com1;
SoComplex com2 = com1;
SoComplex();
}
SoSimple::SoSimple()
{
simObjCnt++;
cout<<"So Simple object: "<<simObjCnt<<endl;
}
SoComplex::SoComplex()
{
cmxObjCnt++;
cout<<"So complex object: "<<cmxObjCnt<<endl;
}
SoComplex::SoComplex(SoComplex ©)
{
cmxObjCnt++;
cout<<"So complex object: "<<cmxObjCnt<<endl;
}
simObjCnt는 SoSimple 객체들이 공유하는 변수이고
comObjCnt는 SoComplex 객체들이 공유하는 변수이다.
이 둘은 모두 전역변수이기 때문에 어디서든 접근 가능하다. 따라서 문제를 일으킬 소지가 매우 높다.
static 멤버변수
satatic멤버 변수는 클래스 변수라고도 하며, 클래스당 하나씩만 생성된다.
아래는 simObjCnt를 SoSimple클래스의 static변수로 선언한 예이다.
class SoSimple
{
private:
static int simObjCnt; //static 멤버변수, 클래스 변수
public:
SoSimple();
};
이렇게 SoSimple 클래스 안에 선언된 static변수는 모든 SoSimple객체가 공유하는 구조이고 생성 및 소멸의 시점도 전역변수와 동일하다.
'C++' 카테고리의 다른 글
학번, 중간성적, 기말성적 입력 프로그램 (0) | 2022.04.14 |
---|---|
mutable (0) | 2022.04.10 |
friend (0) | 2022.04.10 |
연산자 오버로딩 (0) | 2022.04.10 |
멤버 메서드의 선언, 정의 분리 (0) | 2022.04.10 |