정적 멤버란 클래스에는 속하지만 객체 별로 할당되지 않고 클래스의 모든 객체가 공유하는 멤버를 의미한다. 무슨 소리인지 알듯 말듯 하다. 아래 예제를 보자.
class A
{
public:
A() = default;
virtual ~A() = default;
bool func1(); // 멤버 함수 선언
static bool func2(); // 정적 멤버 함수 선언
};
int main()
{
A a; // 객체를 만듦
a.func1(); // 멤버함수 호출. `객체이름.멤버함수` 형식
A::func2(); // 정적멤버함수 호출. `클래스이름::멤버함수이름`gudtlr
return 0;
}
그냥 멤버함수는 객체를 만들고, 그 멤버함수로 호출해야 하지만, 정적 멤버함수는 객체를 생성하지 않고도 클래스 이름만으로 호출이 가능하다. 더 자세히 알아보자.
멤버 변수가 정적(static)으로 선언되면, 해당 클래스의 모든 객체에 대해 하나의 데이터만이 유지 관리된다. 선언은 클래스 영역에서하고, 정의는 파일 영역에서 수행한다. 외부연결(external linkage)을 가지므로, 여러 파일에서 접근할 수 있다. 예제는 다음과 같다.
class Person
{
private:
string name_;
int age_;
public:
static int person_count_; // 정적 멤버 변수의 선언
Person(const string& name, int age); // 생성자
~Person() { person_count_--; } // 소멸자
void ShowPersonInfo();
};
...
int Person::person_count_ = 0; // 정적 멤버 변수의 정의 및 초기화
정적 멤버 함수는 해당 클래스의 객체를 생성하지 않고도, 클래스 이름만으로 호출할 수 있다.
정적 멤버 함수는 다음과 같은 특징을 갖는다.
1. 객체를 생성하지 않고 클래스 이름만으로 호출할 수 있다.
2. 객체를 생성하지 않으므로, this 포인터를 가지지 않는다.
3. 특정 객체와 결합하지 않으므로, 정적 멤버 변수만 사용할 수 있다.
예제는 다음과 같다.
class Person
{
private:
string name_;
int age_;
public:
static int person_count_; // 정적 멤버 변수의 선언
static int person_count(); // 정적 멤버 함수의 선언
Person(const string& name, int age); // 생성자
~Person() { person_count_--; } // 소멸자
void ShowPersonInfo();
};
...
int Person::person_count_ = 0; // 정적 멤버 변수의 정의 및 초기화
...
int Person::person_count() // 정적 멤버 함수의 정의
{
return person_count_;
}