const 함수

sz L·2023년 3월 24일
0

C++

목록 보기
13/40
post-thumbnail

const

"이 함수 내에서는 멤버변수에 저장된 값을 변경하지 않겠다!"
매개변수도 아니고, 지역변수도 아닌, 멤버변수에 저장된 값을 변경하지 않겠다는 선언

  • const함수 내에서는 const가 아닌 함수의 호출이 제한된다
  • const 변수는 콜론초기화 해야함
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객체

const 키워드를 통해서 변수를 상수화 하듯이 객체도 상수화 할 수 있다.

상수화된 변수

const int num=10;

상수화된 객체

const SoSimple sim(20);
  • 객체가 상수화 되면 객체의 데이터 변경을 허용하지 않는다
  • 객체에 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 ShowData() const
	{
		cout << "num: " << num << endl;
	}
};

int main()
{
	const SoSimple obj(7);
	//obj.AddNum(); //const 가 아니라 호출 불가
	obj.ShowData();

	return 0;
}


위 코드에서 AddNum은 const 멤버함수가 아니라서 호출이 불가능하다.


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);
profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글