헷갈리는 const사용시,
전통적인 const의 사용법과는 좀 틀리지만 알아보기 쉬운 스타일을 소개한 내용이다.
기존에 사용되는 고전적인 방법과 다음에 소개되는 사용 스타일중 어떤것이 더 이해하기 쉬운지는 각자 판단에 맡긴다...
const 사용 style :
1. const 선언을 위해서는 const가 되어야하는것 오른쪽에 const를 위치한다.
예를 들어 const char에 대한 포인터를 선언하는 경우 다음과 같다.
// pointer to const char
const char a ='a';
const char b ='b';
// 고전적인 방법
const char* p0=&a;
p0=&b; //OK
*p0 ='c'; //Not OK
// 위의 규칙을 적용, 다음처럼 가능.
char const *p; //좀 이해하기 쉬운가?
p=&b; //OK
// 위의 규칙을 적용, 다음처럼 가능.
char const *p; //좀 이해하기 쉬운가?
p=&b; //OK
*p ='c'; //Not OK
// 위규칙을 적용한 또다른 경우 (문자열)
// 고전적인 방법
const char* NAME = "Foo"; // NAME=> const char* "Foo"에 대한 포인터
NAME[0] = 'g'; //Not OK
// 위규칙을 적용한 또다른 경우 (문자열)
// 고전적인 방법
const char* NAME = "Foo"; // NAME=> const char* "Foo"에 대한 포인터
NAME[0] = 'g'; //Not OK
NAME = "Bar"; //OK
// 위의 규칙을 적용, 다음처럼 가능.
char const* NAME1 = "Foo"; // NAME1=> const char* "Foo"에 대한 포인터
// 위의 규칙을 적용, 다음처럼 가능.
char const* NAME1 = "Foo"; // NAME1=> const char* "Foo"에 대한 포인터
NAME1[0] = 'g'; //Not OK
NAME1 = "Bar"; //OK
2. 이선언을 해석하기 위해서는 오른쪽에서 왼쪽으로 가면서 해석한다.
즉, p는 const char에 대한 포인터이다.
참조
2. 이선언을 해석하기 위해서는 오른쪽에서 왼쪽으로 가면서 해석한다.
즉, p는 const char에 대한 포인터이다.
참조
char에 대한 const 포인터를 선언하는 경우 다음과 같다.
// const pointer to char
// const pointer to char
char a2 = 'a';
char b2 = 'b';
char* const p2 = &a2;
p2=&b2; //Not
OK *p2='c'; //OK
해석 역시, p는 const 포인터 (char에 대한) 로 해석한다.
해석 역시, p는 const 포인터 (char에 대한) 로 해석한다.
const pointer to const char* 경우 :
어떤 개발자가 NAME의 내용을 변경못하게 하기 위해,
const char*를 가르키는 포인터 NAME을 다음처럼 선언했다고 가정한다.
const char* NAME = "Foo"; (혹은 앞서 설명된대로.. char const* NAME = "Foo"; )
그래서, 다음처럼 사용될수 없다.
const char*를 가르키는 포인터 NAME을 다음처럼 선언했다고 가정한다.
const char* NAME = "Foo"; (혹은 앞서 설명된대로.. char const* NAME = "Foo"; )
그래서, 다음처럼 사용될수 없다.
NAME[0] = 'g';
그런데 다음은 가능하다. 이것은 의도했던 상황은 아니다.
NAME = "Bar"; //"Bar" 역시 const char* 이기 때문.
이것을 막기 위해서는 상수 char*를 가르키는 포인터 NAME 역시 const로 지정해야한다.
const char* const NAME = "Foo"; //혹은
char const* const NAME = "Foo";
const char* const NAME = "Foo"; //혹은
char const* const NAME = "Foo";