본문 바로가기
개발 언어/cpp

cpp static const 변수

by eeeun:) 2022. 1. 3.
반응형

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 변수는 클래스 내에서 초기화 가능!

728x90

댓글