정적 데이터 멤버 (C++)
클래스는 정적 멤버 데이터 및 멤버 함수를 포함할 수 있습니다. 데이터 멤버를 정적으로 선언하는 경우, 클래스의 모든 개체에 대해 한 데이터의 복사본을 하나만 유지 합니다. (자세한 내용은 정적 멤버 함수를 참조하십시오.)
정적 데이터 멤버는 지정한 클래스 형식의 개체의 일부가 아니라 별도 개체입니다. 따라서 정적 데이터 멤버의 선언은 정의로 간주되지 않습니다. 데이터 멤버는 클래스 범위에서 선언되지만 정의는 파일 범위에서 수행됩니다. 이 정적 멤버에는 외부 링크가 있습니다. 다음 예제는 이러한 과정을 보여 줍니다.
// static_data_members.cpp
class BufferedOutput
{
public:
// Return number of bytes written by any object of this class.
short BytesWritten()
{
return bytecount;
}
// Reset the counter.
static void ResetCount()
{
bytecount = 0;
}
// Static member declaration.
static long bytecount;
};
// Define bytecount in file scope.
long BufferedOutput::bytecount;
int main()
{
}
위 코드에서 bytecount 멤버가 BufferedOutput 클래스로 선언되지만 클래스 선언 밖에 정의되어야 합니다.
정적 데이터 멤버는 클래스 형식의 개체를 참조하지 않고 참조할 수 있습니다. BufferedOutput 개체를 사용하여 작성된 바이트 수는 다음과 같이 얻을 수 있습니다.
long nBytes = BufferedOutput::bytecount;
정적 멤버가 존재하려면 어떤 클래스 유형 개체도 필요하지 않습니다. 정적 멤버들은 또한 멤버-선택(. 및 –>>) 연산자를 사용하여 접근될 수 있습니다. 예를 들면 다음과 같습니다.
BufferedOutput Console;
long nBytes = Console.bytecount;
위 사례에서 개체(Console)에 대한 참조는 계산되지 않습니다. 반환된 값은 정적 개체 bytecount에 대한 것입니다.
정적 데이터 멤버는 클래스 멤버 액세스 규칙에 영향을 받으므로 정적 데이터 멤버에 대한 private 액세스는 class-member 함수 및 friend에만 허용됩니다. 이 규칙은 멤버 액세스 제어에 설명되어 있습니다. 액세스 제한과 관계없이 정적 데이터 멤버를 파일 범위 내에 정의해야 한다는 것은 예외입니다. 데이터 멤버가 명시적으로 초기화되는 경우 이니셜라이저가 정의와 함께 제공되어야 합니다.
정적 멤버의 형식은 클래스 이름으로 한정되지 않습니다. 따라서 BufferedOutput::bytecount의 형식은 long입니다.