함수 선언 및 구현시 함수 괄호 () 뒤에 const가 붙는 함수.
상수 멤버 한수 안에서는 모든멤버를 상수 취급한다.
멤버데이터의 값을 읽을 수는 있지만 변경할 수는 없다.
class Point
{
int x, y;
public:
Point(int a = 0, int b = 0) : x(a), y(b) {}
void set( int a, int b ) { x = a; y = b; }
void print() const // 상수멤버함수
{
//x = 10; // error
std::cout << x << ", " << y << std::endl;
}
};
상수 멤버 함수를 사용하는 이유는 코드 작성시 안정성을 위해서. 상수객체는 상수 멤버 함수만 호출할 수 있다.
위의 코드를 불러왔을때 객체를
const Point pt(1,1); 로 상수 객체를 선언하게되면
print() 함수가 상수멤버함수가 아니라면 호출 시 error가 발생하게된다.
따라서 상수 객체를 선언하게 되었을때 상수객체이므로 객체의 상태를 변경할 수 없어야 하지만 상태를 얻거나 출력할 수 는 있어야 하기 때문에 print 멤버함수는 반드시 상수 멤버 함수로 해야한다.
사용자 정의 타입을 함수로 전달할 때 const reference가 좋기 때문에, 이때 함수내에서 get 함수를 사용하면 const 함수가 아닐경우는 에러가 발생하게 된다.
객체의 상태를 변경하지 않은 모든 멤버 함수는 반드시 상수 멤버 함수로 만들어야한다.
mutable 멤버 데이터
상수 멤버 함수 안에서도 값을 변경할 수 있다.
class Point
{
int x, y;
mutable int cnt = 0;
public:
Point(int a = 0, int b = 0) : x(a), y(b) {}
void print() const
{
++cnt;
std::cout << x << ", " << y << std::endl;
}
};
동일 이름의 상수 멤버 함수와 비 상수 멤버 함수를 만들 수 있다.
class Test
{
public:
void foo() {} // 1
void foo() const {} // 2
};
int main()
{
Test t1;
t1.foo(); // 1 번호출, 없으면 2번 호출
const Test t2;
t2.foo(); // 2번 호출, 없으면 error
}
상수 멤버 함수 안에서 모든 멤버는 const이다.
따라서 아래 코드와 같은 경우에도 data는 const이기 때문에 const int* 를 반환해야한다.
class Test
{
int data;
public:
//int* getData() const
const int* getData() const
{
// data는 상수이다. : const int data
return &data;
}
};
선언부와 구현부를 분리할 때에는 선언과 구현 모두에 const를 표기 해야한다.
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 상속 (0) | 2021.08.21 |
---|---|
[C++] this 포인터 개념 (0) | 2021.08.20 |
[C++] static member 정적 멤버 데이터, 함수 (0) | 2021.08.19 |
[C++] 복사생성자 (0) | 2021.08.19 |
[C++] 포인터와 레퍼런스 (0) | 2021.08.18 |