"이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다!"
매개변수도 아니고, 지역변수도 아닌, 멤버변수에 저장된 값을 변경하지 않겠다는 선언
private: const int num=10; public: SoSimple(int n) : num(n)
int GetNum() { return num; } void Show() const { cout << GetNum() << endl; }
이 경우 Show()라는 const로 정의된 함수에서 GetNum()이라는 const가 아닌 함수의 호출이 발생하므로 에러발생
int GetNum() const { return num; } void Show() const { cout << GetNum() << endl; }
위와같이 수정해야 오류가 안 남
const 키워드를 통해서 변수를 상수화 하듯이 객체도 상수화 할 수 있다.
상수화된 변수
const int num=10;
상수화된 객체
const SoSimple sim(20);
#include <iostream>
using namespace std;
class SoSimple
{
private:
int num;
public:
SoSimple(int n) : num(n)
{ }
SoSimple& AddNum(int n)
{
num += n;
return *this;
}
void ShowData() const
{
cout << "num: " << num << endl;
}
};
int main()
{
const SoSimple obj(7);
//obj.AddNum(); //const 가 아니라 호출 불가
obj.ShowData();
return 0;
}
위 코드에서 AddNum은 const 멤버함수가 아니라서 호출이 불가능하다.
const 선언유무도 함수 오버로딩의 조건에 해당한다.
#include <iostream>
using namespace std;
class SoSimple
{
private:
int num;
public:
SoSimple(int n) : num(n)
{ }
SoSimple& AddNum(int n)
{
num += n;
return *this;
}
void SimpleFunc()
{
cout << "SimpleFunc: " << num << endl;
}
void SimpleFunc() const
{
cout << "const SimpleFunc: " << num << endl;
}
};
void YourFunc(const SoSimple& obj)
{
obj.SimpleFunc();
}
int main()
{
SoSimple obj1(2);
const SoSimple obj2(7);
obj1.SimpleFunc();
obj2.SimpleFunc();
YourFunc(obj1);
YourFunc(obj2);
return 0;
}
- 일반 객체와 const 객체를 각각 생성
SoSimple obj1(2); const SoSimple obj2(7);
- 일반 객체 대상으로 함수 호출 시 일반 멤버 변수, const 객체를 대상으로 함수 호출 시 const 멤버 함수 호출
obj1.SimpleFunc(); // 일반 객체 -> void SimpleFunc() obj2.SimpleFunc(); // const 객체 -> void SimpleFunc() const
YourFunc
함수는 전달되는 인자를 참조자로, 그것도 const 참조자로 받는다.
- 참조자를 이용한
obj.SimpleFunc();
호출의 결과로void SimpleFunc() const
가 호출된다YourFunc(obj1); YourFunc(obj2);