const 는 예약어이다
예약어는 변수명이나 함수명으로 못씀
class CObj
{
public:
const int m_iTest;
int m_iTest2;
const float m_fTest;
public:
CObj(void)
:m_iTest(10), m_iTest2(20), m_fTest(30.f) // 이니셜라이저 문법사용
{
//m_iTest = 10; 생성자 에서도 초기화는 불가능하다
//생성자가 호출되는 시점은 멤버들이 이미 메모리 공간에 할당된 시점이기때문에 const 멤버를 초기화 할수없다
//이니셜라이저 문법을 사용해서 const 멤버를 초기화 할수있다
}
CObj(int iTest, int iTest2, float fTest)
:m_iTest(iTest),m_iTest2(iTest2), m_fTest(fTest)
{;}
~CObj(void){;}
};
void main(void)
{
const int J = 10; //초기화된 값으로 고정이 되는것
J = 20; //이런식으로 값은 못바꾼다 상수화 되었기때문에
const int Test; // 이런식으로 초기화 안하면 안됨
//선언과 동시에 초기화가 일어나야 한다
CObj obj;
obj.m_iTest = 10; //안된다
//이니셜라이저 자체가 생성자 몸체 부분이 실행되기전에 실행이 되기때문
//이니셜라이저 문법으로 통해서 const 멤버 변수를 초기화 할수있다
}
class CTest
{
private:
int m_iValue;
public:
void Render(void) const
{
//함수뒤에 const가 붙으면 내부에서 멤버변수의 값을 변경하려고 할때 에러가 발생한다
//m_iValue;
Test(); // 컴팡일러가 멤버변수의 조작가능성이 있나 없나를 판단할때 const인가 아닌가 만 보기 때문이다
// Test 에 const 가 있어야한다
cout << m_iValue << endl;
}
const int* GetValue(void) const
//리턴값이 변경불가한 함수내에서 값의변경이 불가한 const
//const
{
return &m_iValue;
}
void Test(void) const
{
cout << "Test"<< endl;
}
public:
CTest(void)
:m_iValue(0)
{;}
~CTest(void){;}
};
void main(void)
{
//const 멤버함수
CTest Test;
Test.Render();
const int* p = Test.GetValue();
cout << *p << endl;
//*p = 10 // 이런식 초기화 안됨
// 값을 넘길때 변경없이 단순 사용하는 경우에는 값의 신뢰도를 높이기 위해서 const화 해주는것이 좋다
}
class CSimple
{
public:
void Render(void)
{
cout << "Render called" << endl;
}
void Render(void) const
{
cout << "Redner const called " << endl;
}
};
void main(void)
{
//const 객체
//객체를 생성하고 나면 초기화된 값이 변하지 않게 된다
//const 객체를 통하여 함수 접근시에 데이터으 ㅣ조작여부에 따라서 에러가 날수도 아닐수도 있다
CSimple simple;
simple.Render(); //Render called
const CSimple simple_const;
simple_const.Redner() // Render const called
//const 객체와 그렇지 않을때 호출되는 함수가 다른것에 유의. const 를통해서도 오버로딩 조건이 만족된다
}
댓글