const 는 데이터 선언을 할 때 객체 또는 변수를 수정할 수 없음을 지정하는 수식어로, 해당 값이 상수임을 지정하고 코드 상에서 수정할 수 없도록 컴파일러에서 세팅하게 됩니다.
C++ 에서 정의된 const 값은 상수 식 대신 사용할 수 있습니다.
const int maxarray = 255;
char store_char[maxarray]; // allowed in C++; not allowed in C
멤버 함수를 const 로 선언하면 호출되는 객체 또는 변수를 수정하지 않는 "읽기 전용" 함수임을 지정합니다. 상수 멤버 함수는 비정적 데이터 멤버를 수정하거나 상수가 아닌 멤버 함수를 호출할 수 없습니다. 상수 멤버 함수를 선언하려면 인수 목록의 닫는 괄호 뒤에 const 를 선언해야 합니다.
즉, 상수 멤버 함수 안에서 호출되는 비정적 데이터는 수정이 불가능하다는 뜻입니다. ( 함수 반환값이랑은 상관 X )
class Date
{
public:
Date( int mn, int dy, int yr );
int getMonth() const; // A read-only function
void setMonth( int mn ); // A write function; can't be const
private:
int month;
};
int Date::getMonth() const
{
return month; // Doesn't modify anything
}
void Date::setMonth( int mn )
{
month = mn; // Modifies data member
}
int main()
{
Date MyDate( 7, 4, 1998 );
const Date BirthDate( 1, 18, 1953 );
MyDate.setMonth( 4 ); // Okay
BirthDate.getMonth(); // Okay
BirthDate.setMonth( 4 ); // C2662 Error
}
또한, const 로 선언된 객체는 const 멤버 함수만 호출이 가능하고, 객체 내 멤버 변수 수정은 불가능합니다.
함수 인자 전달 시에 const& 형식으로 전달하는 것을 보통 권장합니다.
그 이유는 아래에서 알아볼 수 있습니다.
- 먼저 객체를 인자로 사용하는 경우 (pass by value)
값에 의한 전달방식은 인자의 원본을 사용하는 것이 아닌 복사하여 사용하므로 임시 복사본을 생성합니다.
이 때문에 부가적인 할당과 메모리 사용이 일어납니다. (복사 생성자 호출)
- 참조(&)를 인자로 사용하는 경우 (pass by reference)
실제 객체의 원본을 사용하기 때문에 복사 생성자 호출 비용이 없지만, 객체 멤버가 수정될 위험은 존재합니다.
(캡슐화 X)
- const 참조(&)를 사용하는 경우 (pass by reference to const)
객체의 원본을 사용해도 내부의 멤버를 변경할 수 없기 때문에 캡슐화를 지킬 수 있습니다.
자료 출처
'C++ > Type' 카테고리의 다른 글
Pointer - vs - Reference (0) | 2024.01.16 |
---|