[C/C++] const
CS/C/C++ 2009. 9. 10. 09:15원문 : Effective C++
char greeting[] = "Hello";
char *p = greeting;
const char * p = greeting; // 상수 데이터 (char const * p = greeting;)
char * const p = greeting; // 상수 포인터
const char * const p = greeting; // 상수 데이터, 상수 포인터
class Sample
{
public:
Sample(char e) : _elem(e) {}
const char* Get() const { return &_elem; }
// 앞의 const는 return type이 const라는 것이고, 뒤의 const는 상수 멤버임을 의미한다.
// 상수 멤버란, 어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 함(static 멤버 제외).
private:
char _elem;
};
만약,
char* Get() const { return &_elem; }
같이 한다면, 상수 객체에 대한 포인터를 리턴받아 값을 수정하는 것이 가능해 지므로 compile error.
const 키워드가 있고 없고의 차이만 있는 멤버 함수는 오버로딩이 가능하다.
class TextBlock
{
public:
...
// 상수 객체에 대한 operator[]
char greeting[] = "Hello";
char *p = greeting;
const char * p = greeting; // 상수 데이터 (char const * p = greeting;)
char * const p = greeting; // 상수 포인터
const char * const p = greeting; // 상수 데이터, 상수 포인터
class Sample
{
public:
Sample(char e) : _elem(e) {}
const char* Get() const { return &_elem; }
// 앞의 const는 return type이 const라는 것이고, 뒤의 const는 상수 멤버임을 의미한다.
// 상수 멤버란, 어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 함(static 멤버 제외).
private:
char _elem;
};
만약,
char* Get() const { return &_elem; }
같이 한다면, 상수 객체에 대한 포인터를 리턴받아 값을 수정하는 것이 가능해 지므로 compile error.
const 키워드가 있고 없고의 차이만 있는 멤버 함수는 오버로딩이 가능하다.
class TextBlock
{
public:
...
// 상수 객체에 대한 operator[]
const char& operator[](std::size_t position) const { return text[position]; }
// 비 상수 객체에 대한 operation[]
char& operator[](std::size_t position) { return text[poistion]; }
private:
std::string text;
};
TextBlock tb("Hello");
tb[0] = 'x'; // 비 상수 멤버를 호출
const TextBlock ctb("World");
cout << ctb[0]; // 상수 멤버를 호출
// 비 상수 객체에 대한 operation[]
char& operator[](std::size_t position) { return text[poistion]; }
private:
std::string text;
};
TextBlock tb("Hello");
tb[0] = 'x'; // 비 상수 멤버를 호출
const TextBlock ctb("World");
cout << ctb[0]; // 상수 멤버를 호출