C++에서 클래스는 정적 및 비정적 멤버(변수 및 함수)를 가질 수 있습니다. 이는 모든 클래스 인스턴스에 대한 공통 데이터를 지원하고, 특정 인스턴스의 상태에 접근할 필요가 없는 함수에 사용되기 위해 등장했습니다.
정적 및 비정적 멤버를 구별하는 것은 중요합니다. 왜냐하면 그들의 라이프 사이클, 범위 및 초기화 규칙이 다르기 때문입니다. 자주 발생하는 오류에는 잘못된 정의, 인스턴스 및 정적 멤버의 동시 사용, 헤더 파일에서의 중복 정의가 포함됩니다.
클래스의 정적 변수는 클래스 내부에서 static으로 선언되지만, 클래스 외부에서 별도로 정의되어야 합니다(C++17 이전). 그들은 단일 인스턴스 존재합니다. 정적 함수는 명시적으로 지정하지 않는 한 비정적(인스턴스) 멤버에 접근할 수 없습니다.
코드 예시:
class Counter { public: static int count; Counter() { ++count; } static void Reset() { count = 0; } }; int Counter::count = 0;
주요 특징:
정적 클래스 변수를 클래스 내부에서 직접 초기화할 수 있나요? (C++17 이전)
아니요, C++17 이전에는 정적 멤버는 클래스 외부에서 정의해야 합니다. C++17 이상에서는 인라인 정적 변수는 클래스 내부에서 직접 정의할 수 있습니다.
// C++17 class Foo { inline static int counter = 0; };
정적 클래스 함수는 this나 비정적 멤버에 접근할 수 있나요?
아니요, 정적 멤버는 비정적 멤버나 this에 접근할 수 없습니다. 클래스의 인스턴스가 생성되더라도 마찬가지입니다. 접근하려면 객체를 명시적으로 전달해야 합니다.
정적 클래스 멤버는 클래스를 생성할 때마다 생성되나요?
아니요, 정적 멤버는 클래스 전체에 대해 단일 인스턴스로 존재하며 객체 수와는 관계없습니다.
개발자가 클래스에서 static int를 선언하지만 클래스 외부에서 정의하지 않습니다. 링커가 정의되지 않은 기호 오류(undefined symbol)를 발생시킵니다. 정적 멤버가 초기화되지 않았기 때문입니다.
장점:
단점:
정적 멤버가 클래스에 선언되고 클래스 외부에서 정의되며, 생성된 객체의 수를 세는 데 사용됩니다.
장점:
단점: