본문 바로가기

STUDY/C++

[ Const 2편 ] Class에서의 Const초기화


Q. 다음 코드는 2가지 면에서 오류가 난다. 그 이유는 ?


class Point 

{

private:

int Number;

const int const _Number;


public:

int MinusNumber(int _Numver) const

{

Number = _Numver;

}

};


void main()

{

Point NewTest = Point();

NewTest.MinusNumber(20);


}


 (1) 일단 Const가 붙은 함수는 함수 내에서 Class 내의 변수 수정이 불가하다. 

 (2) Const변수는 초기화가 되어야 하는데 안 되어있다. 


그렇다면 Const변수는 어떻게 초기화를 할 수 있을까? 


Point(int Num)

{

_Number = Num;

}


이렇게 생성자에 해주면 될 것 같지만, 메모리 구조상 생성자가 호출되기 전인 const int const _Number; 이라고 선언과 동시에 쓰레기값으로 채워지므로 초기화가 끝나버린다.

이러한 경우 이니셜라이저로 초기화해야한다. 이니셜라이저는 생성자가 호출되기 이전에 완료가 된다는 특징을 가지므로 Const변수를 초기화 할 수 있다.


Point(int Num = 0)

: _Number(Num)

{

}


+  Const변수의 종류와 데이터영역


const int Const_Global_Var = 10; -> 뒤에붙은것이 상수이므로 상수종류, code영역


int main()

{

int Value = 50;

const int Const_Range_Var1 = Value;-> 뒤에붙은것이 지역변수이므로 지역변수종류, stack영역

const int Const_Range_Var2 = 10;-> 뒤에붙은것이 상수이므로 상수종류, code영역

}


Const의 데이터 영역은 = 뒤에 붙어있는 값의 데이터영역을 따른다. 

= 뒤에 붙은것이 상수면 전역변수라도 종류는 상수가되며 데이터영역은 Code이다.