우리는 멤버변수를 private으로 선언하면서 클래스 외부에서의 멤버변수 접근을 목적으로 정의되는 액세스 함수를 사용할 때 const를 사용하였다.
ex)
int GetX() conts;
int GetY() const;
void ShowRecInfo() const;
const를 사용함으로써 함수 내에서 멤버변수에 저장된 값을 변경할 수 없게 된다. 멤버변수에 저장된 값을 변경하지 않겠다는 선언이다.
따라서 const 선언이 추가된 멤버함수 내에서 멤버변수의 값을 변경하는 코드가 삽입되면, 컴파일 에러가 발생한다.
따라서 const로 함수를 선언하면, 실수로 자신의 의도와 다르게 멤버변수의 값을 변경했을 때, 컴파일 에러를 통해서 이를 확인할 수 있다. 이는 프로그래머의 실수를 최소화하기 위한 매우 의미 있는 선언이다.
const의 또 다른 특징들을 아래 코드들을 통해 살펴보겠다.
ex1)
class SimpleClass{
private:
int num;
public:
void InitNum(int n){
num=n;
}
int GetnNum(){ //const 선언이 추가되어야 아래의 컴파일 에러 소멸
return num;
}
void ShowNum() const{
cout<<GetNum()<<endl; //컴파일 에러 발생
}
};
위의 클래스 정의에서 ShowNum 함수는 const 함수로 선언되었다. 그리고 실제로 함수 내에서는 멤버변수 num의 값을 변경하지 않는다. 그럼에도 불구하고 GetNum 함수를 호출하는 문장에서 컴파일 에러가 발생한다.
이유는 const 함수 내에서는 const가 아닌 함수의 호출이 제한된다.
const로 선언되지 않은 함수는 아무리 멤버변수에 저장된 값을 변경하지 않더라도, 변경할 수 있는 능력을 지닌 함수이다. 따라서 이러한 변경이 가능한 함수의 호출을 아예 허용하지 않는다.
ex2)
class EasyClass{
private:
int num;
public:
void InitNum(int n){
num=n;
}
int GetNum(){ //const 선언이 추가되어야 아래의 컴파일 에러 소멸
return num;
}
void ShowNum() const{
cout<<GetNum()<<endl; //컴파일 에러 발생
}
};
class LiveClass{
private:
int num;
public :
void InitNum(const EasyClass &easy){
num=easy.GetNum(); //컴파일 에러 발생
}
};
위의 클래스 정의에서 InitNum 함수의 매개변수 easy는 'const 참조자'이다. 그런데 이를 대상으로 GetNum 함수를 호출하면 컴파일 에러가 발생한다. 이는 GetNum이 const 함수가 아니기 때문에 C++에서는 const 참조자를 대상으로 값의 변경 능력을 가진 함수의 호출을 허용하지 않는다. 따라서 const 참조자를 이용해서는 const 함수만 호출이 가능하다.
이처럼 const의 사용이 많아지고 이 것을 잘 활용한다면 작성한 코드의 안정성은 높아진다.
'c++' 카테고리의 다른 글
[C++]생성자(Constructor)와 소멸자(Destructor) (0) | 2023.02.25 |
---|---|
[C++]캡슐화 (0) | 2023.02.19 |
[C++]정보은닉(information Hiding) (0) | 2023.02.18 |
[C++]객체지향 프로그래밍의 이해(메시지 전달) (0) | 2023.02.11 |
[C++]파일분할 (0) | 2023.02.10 |