본문 바로가기

C++/Type

Const

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