c++98으로만 코드를 짜는 중에 발생한 오류!
error: default member initializer for non-static data member is a C++11 extension
[-Werror,-Wc++11-extensions]
클래스 안에서 변수 초기화는 c++11부터 지원해준다!😱
class A {
private:
int a = 0;
}
이렇게 쓰는 것이 불가능!!
c++98에서 static const 변수에는 클래스 안에서 초기화가 가능!
그렇다면 static const는 왜 클래스 안에서 초기화가 가능할까!?
static 변수란?
객체들이 생성될 때마다 생성되는 것이 아닌, 클래스가 정의되기 이전(프로그램 시작과 끝까지)부터 메모리에 할당된 변수
= 클래스 변수(클래스 당 하나씩만 생성됨)
A 클래스가 static 변수를 가지고 있다면 A 클래스로부터 생성되는 모든 객체들은 변수 사용 가능!
그럼 static 변수는 왜 사용해야 될까?
전역 변수는 어디서나 접근 가능한 변수이기 때문에 위험함!
static 변수는 전역 변수의 특징을 가지면서, 캡슐화를 지켜 정보은닉을 해주는 장점을 가짐!
const 변수( = 상수)란?
평소에 변수를 사용할 때 밑에 코드와 같이 쓸 수 있다
int a = 3;
std::cout << a << std::endl; -> 3
a = 5;
std::cout << a << std::endl; -> 5
int 변수를 쓰고 싶으면 int a = 3;이라고 초기화를 한 뒤에도 a = 5;처럼 언제든 값을 바꾸기 가능
하지만 const를 사용하면 프로그램 도중에 값 바꾸기 불가능
프로그램 실행 동안 값을 바꿀 수 없게 하기 위해서 const를 사용!
const 변수는 선언과 동시에 초기화가 이루어져야 하기 때문에 이니셜라이저가 필수!
변수를 상수화해주는 키워드가 바로 const!
static const 변수란?
static 변수를 상수화시킴 = 모든 객체에서 공유 가능하고 접근 가능한 const 변수
그렇다면 초기화는 어떻게 할까?
class A {
private:
static const int a = 0;
}
1. static 변수의 초기화는 클래스 외부에서 가능
2. const는 선언 즉시 초기화 필수 -> 이니셜라이저 필수
3. 이니셜라이저는 생성자가 호출될 때 사용됨
4. static 변수는 생성자가 호출되기 전에 메모리에 할당됨
위의 조건들을 만족시키기 위해 특별히 static const 변수는 클래스 내에서 초기화 가능!
'개발 언어 > cpp' 카테고리의 다른 글
cpp 난수 생성 (random number generation) : PRNG (0) | 2022.01.08 |
---|---|
cpp 멤버 이니셜라이저(Member Initializer) (0) | 2022.01.03 |
cpp 멤버 함수 안에서 자신과 동일한 클래스 객체 private 멤버 접근 (0) | 2021.12.30 |
cpp 증감 연산자 오버로딩 (전위 연산자, 후위 연산자) (0) | 2021.12.30 |
CPP 클래스 상속(Inheritance) (0) | 2021.12.22 |
댓글