본문 바로가기
프로그래밍/사소한 팁

const에 대해서

by 리뷰하는 (게임)프로그래머_리프TV 2010. 3. 23.




const에 대해서 다시 한번 복습해 보고,

C++에서의 멤버 함수, 객체 그리고 함수 오버로딩에 대해서 집어 보자.

const의 기본 개념부터 다시 한번 집어 보자.


#include <iostream>

void main()
{
	// 포인터가 아니라면 n1, n2는 모두 같은 의미라고 봐도 무방.
	const int n1 = 10;
	int const n2 = 10;

	//n1 = 10; 상수화 되어있어서 불가능
	//n2 = 10; 마찬가지로 불가능
}​



const int* pn

	int n = 10;
	// const int*를 하면 pn이 가르키는 대상을 보호한다.
	const int* pn;
	// pn은 누구든 가르킬 수 있으나
	pn = &n;
//	*pn = 20; pn이 가르키고 있는 것은 const 보호를 받는다.(컴파일에러)
	// 그렇다고 int n 자체가 상수가 되어 버리는 것은 아니다.
	n = 20;​




int* const pn


	int n = 10;
	int n2;
	// 초기에 꼭 값을 삽입해 주어야 한다.
	int* const pn = &n;
	
	// pn을 사용해 값을 변경하는 것은 상관없지만.
	*pn = 20;

	// pn이 n이 아닌 다른 값은 가르킬 수 없다.
	//pn = &n2;​



const int* function()

#include <iostream>

int g_n;

int* function1()
{
	return &g_n;
}

const int* function2()
{
	return &g_n;
}

void main()
{
	// function에서 리턴된 값에 10을 넣는 다는 의미
	*function1() = 10;	// 가능하다. g_n = 10; 과 같다.
	*function2() = 10;	// const로 리턴 값을 보호 하고 있기 때문에 불가능
}​




int function() const;

#include <iostream>

int g_val = 10;

class AAA
{
	int n;
public:
	// 멤버 함수안에선 멤버 변수의 값 수정이 불가능
	int fun() const
	{
		int val;

		// 하지만 함수내 지역변수는 가능하다.
		val = 20;
		// 그리고 전역 변수도 가능
		g_val = 20;
		// 단지 멤버 변수의 값 수정만 불가능하다.
		n = 10;
		return n;	// 리턴은 가능하다.
	}
};

void main()
{
	AAA a;
	a.fun();
}​


const 함수와 오버로딩

#include <iostream>

class AAA
{
public:
	// AAA a에서 fun 함수를 호출하면 이쪽으로 온다.
	void fun() 
	{
		std::cout << "fun() " << std::endl;
	}
	// const AAA ca에서 fun 함수 호출시 이쪽으로 이동.
	void fun() const
	{
		std::cout << "fun() const" << std::endl;
	}

};

void main()
{
	// AAA객체와 const AAA객체
	const AAA ca;
	AAA a;

	// 각각 같은 이름의 함수라도 서로 다른 함수를 호출한다.
	ca.fun();
	a.fun();
}​




멤버 변수의 coinst

#include <iostream>

class AAA
{
	// 멤버 변수를 const화
	const int a;
	int b;
public:
	// 멤버 변수가 const화 되어 있다면 멤버 이니셜 라이징을 사용
	AAA() : a(10)
	{
		// 불가능하다 이미 상수화 되어버렸기 때문에(안에는 쓰레기값이 존재)
		// a = 10;
		// 가능하다 int b는 private 변수이기 때문에
		b = 10;
	}
};
void main()
{
	AAA a;
}​