클래스 객체도 const 키워드를 사용해서 상수 객체로 만들 수 있다.

 

상수 객체가 생성자를 통해 초기화 되면 객체의 멤버 변수의 값을 직접 변경하거나

멤버 변수의 값을 설정하는 멤버 함수를 호출하는 작업 등 멤버 변수를 수정하려는 어떠한 시도도 허용되지 않는다.

 

 

어? 그러면 GetValue 는 멤버 변수의 값을 변경하는 작업이 아닌데 왜 컴파일 에러일까?

 

상수 클래스 객체는 => 상수 멤버 함수만 명시적으로 호출 할 수 있기 때문이다.

 

GetValue()를 상수 멤버 함수로 만들려면 const 키워드를 함수 선언의 구현부 앞에 넣으면 된다.

 

결과를 보면 오류가 떴던 something.GetValue() 가 더이상 오류가 생기지 않는것을 확인 할 수 있다.

 

 

그러면 SetValue도 const 를 붙혀서 상수 멤버 함수로 만들면 되는거 아닌가?

 X : 상수 멤버 함수라는 의미는 해당 함수가 어떠한 멤버 변수도 변경하지 않는다는 의미이고

실제로 const 를 붙혀보면, Setvalue() 함수 안에서 m_Value라는 멤버 변수를 변경하고 있으니 컴파일 오류가 뜨게된다.

 

 

상수 멤버 함수는 아래와 같은 특징이 있다.

1. const 멤버 함수에서 멤버 변수 값을 바꾸는 행위를 할 수 없다.
2. const 멤버 함수 안에서 non-const 멤버 함수를 호출할 수 없다.
3. const 클래스 객체에 대해서도 호출할 수 있다.

 

 

+ C++  클래스의 생성자는 멤버 변수를 초기화할 수 있어야하기 때문에, const 키워드 사용을 허용하지 않는다.

 

 


Quiz. 아래는 왜 컴파일 오류가 나는것일까?

 

 

 

정답은 PrintDate() 함수의 파라미터로 date 객체를 복사하지 않기 위해 const 참조를 통해 date 객체를 전달하고 있는데

이떄 PrintDate() 함수 안에서 date 객체는 const 객체로 취급되게 된다.

그리고 상수 date 객체와 함께 GetYear(), GetMonth(), GetDay() 멤버 함수를 호출하는데, 이 멤버 함수는 모두 const 멤버 함수가 아니다.

 

이는 상수 객체에 대해 non-const 멤버 함수를 호출할 수 없으므로 컴파일 오류가 발생하는 것이다.

 

해결법은 간단하게 상수 멤버 함수로 만들면 된다.

 


상수 멤버 함수와 비-상수 멤버 함수의 오버로딩 (Overloading const and non-const function)

마지막으로, 같은 멤버 함수에 대해 상수 버전과 비-상수 버전으로 오버로딩이 가능하다.

 

 

const 버전은 상수 객체에서 데이터를 수정할 수 없도록 강제하므로 유연하게 작동한다.

 

 


https://boycoding.tistory.com/252

 

09.12 - 상수 클래스 객체와 멤버 함수 (Const class object and member function)

상수 클래스 객체와 멤버 함수 (Const class object and member function) 이전 포스트 상수 (const, constexpr, and symbolic constants) 에서 const 키워드를 통해 상수를 만들 수 있고, 모든 상수 변수는 생성..

boycoding.tistory.com

 

+ Recent posts