728x90
반응형
static 클래스 멤버는 클래스의 각 객체의 일부가 아니라 정적으로 할당된다. 일반적으로 static 멤버 선언은 클래스 외부의 정의에 대한 선언 역할을 한다.
class Node {
// ...
static int node_count; // declaration
};
int Node::node_count = 0; // definition
하지만 몇 가지 간단한 특별한 경우에는 클래스 선언에서 static 멤버를 조기화할 수 있다. static 멤버는 정수 또는 열거형 형성의 const이거나 리터럴 형식의 constexpr이어야 하고 intiailizer는 상수식이어야 한다.
class Curious {
public:
static const int c1 = 7; // OK
static int c2 = 11; // error : not const
const int c3 = 13; // OK, but not static (§17.4.4)
static const int c4 = sqrt(9); // error : in-class initializer not constant
static const float c5 = 7.0; // error : in-class not integral (use constexpr rather than const)
// ...
};
초기화된 멤버를 메모리에 객체로 저장해야 하는 방식으로 사용하는 경우에만 해당 멤버가 어딘가에 (고유하게) 정의되어야 한다. intializer는 반복될 수 없다.
const int Curious::c1; // don’t repeat initializer here
const int∗ p = &Curious::c1; // OK: Curious::c1 has been defined
멤버 상수의 주요 용도는 클래스 선언의 다른 곳에서 필요한 상수에 대한 기호 이름을 제공하는 것이다.
template<class T, int N>
class Fixed { // fixed-size array
public:
static constexpr int max = N;
// ...
private:
T a[max];
};
정수의 경우 열거자는 클래스 선언 내에서 기호 상수를 정의하는 대안을 제공한다.
class X {
enum { c1 = 7, c2 = 11, c3 = 13, c4 = 17 };
// ...
};
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] unique_lock, lock_guard (0) | 2022.01.19 |
---|---|
[C++] 함수 delete (0) | 2022.01.17 |
[C++] initializer-list 생성자 (0) | 2022.01.14 |
[C++] 클래스 static 멤버 (0) | 2022.01.14 |
[C++] 클래스 가변성(mutability) (0) | 2022.01.14 |