static 으로 변수나 함수를 선언하면, 컴파일 단계에서 메모리에 적재된다. static이 아니라면 스택 또는 힙 메모리 영역을 돌아다니며 메모리를 할당하고 해제하며 이용하겠지만, static 이기 때문에 프로그램이 실행되서 종료되기 전까지 한 메모리를 계속해서 차지하게 된다.
이로써 발생하는 상황은 한 클래스의 static 멤버는 여러 인스턴스를 생성한다해도 초기화 되지 않고 이전의 값을 갖고 있다는 것이다.
#ifndef SAMPLE_CLASS_H
# define SAMPLE_CLASS_H
class Sample {
public:
Sample(void);
~Sample(void);
static int getNbInst(void);
private:
static int _rbInst;
};
#endif
#include <iostream>
#include "Sample.class.hpp"
Sample::Sample(void) {
std::cout << "Constructor caled" << std::endl;
Sample::_rbInst += 1;
return;
}
Sample::~Sample(void) {
std::cout << "Destructor called" << std::endl;
Sample::_rbInst -= 1;
return;
}
int Sample::getNbInst(void) {
return Sample::_rbInst;
}
int Sample::_rbInst = 0;
#include <iostream>
#include "Sample.class.hpp"
void f0(void){
Sample instance;
std::cout << "Number of instances : " << Sample::getNbInst() << std::endl;
return;
}
void f1(void){
Sample instance;
std::cout << "Number of instance : " << Sample::getNbInst() << std::endl;
f0();
return;
}
int main() {
std::cout << "Number of instances : " << Sample::getNbInst() << std::endl;
f1();
std::cout << "Number of instances : " << Sample::getNbInst() << std::endl;
return 0;
}
main.cpp 파일에 f0 과 f1 함수에서 각각 새로운 인스턴스를 생성한다. 하지만 Sample 클래스에 선언된 static 변수 static int _rbInst
를 호출하면 생성자에 의해 값이 증가된 결과가 유지되는 것을 확인할 수 있다.
생성자에서 증가하는 코드는 Sample::_rbInst += 1;
이다.