
정적 멤버란 클래스에는 속하지만 객체 별로 할당되지 않고 클래스의 모든 객체가 공유하는 멤버를 의미한다. 무슨 소리인지 알듯 말듯 하다. 아래 예제를 보자.
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_;
}