Program Language/C & C++

[C++] static 멤버 초기화

야곰야곰+책벌레 2022. 1. 17. 09:27
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