객체 MyString을 인자로 받는 함수를 생각해보자.
이때 MyString은 다음과 같은 형태의 클래스의 객체다.
#include <iostream>
class MyString {
char* string_content; int string_length;
int memory_capacity;
// 문자열 데이터를 가리키는 포인터 // 문자열 길이
public:
// capacity 만큼 미리 할당함. MyString(int capacity);
// 문자열로 부터 생성 MyString(const char* str);
// 복사 생성자
MyString(int capacity);
MyString(const MyString& str);
~MyString();
int length() const;
};
// .. 생략..
int main() { MyString s(3); }
이때 DoSomethingWithString이라는 함수가 아래와 같이 객체 s를 인자로 가진다고 하자.
void DoSomethingWithString(MyString s) { // Do something...
}
이때,
DoSomethingWithString("abc")
== DoSomethingWithString(MyString("abc"))
이다.
이를 암시적 변환이라고 한다.
암시적 변환을 막는 키워드.
복사 생성자의 형태로도 호출되는 것을 막는다.
MyString s = "abc"; // 복사 생성자의 형태, 오류
MyString s = 5; // 복사 생성자의 형태, 오류
DoSomethingWithMyString(5); // 오류
MyString s(5); // 허용
원래 const 함수에서는 멤버 변수를 read만 할 수 있고, write는 불가하다.
그러나 멤버 변수를 mutable 키워드로 선언했을 때 const 함수에서도 이들 값을 바꿀 수 있다.
서버 프로그램을 예로 들어보자.
보통은 자주 쓰이는 데이터를 캐시 데이터로 옮겨 두는데,
데이터를 조회할 때(조회니까 const 멤버 함수)
보통 캐시
에서 찾고 -> 캐시에서 없으면 DB
에서 찾고 캐시에 업데이트
하는 방식으로 진행한다.
이때, 캐시에 업데이트하는 것 = const 함수에 위배되는 행동이기 때문에
해당 데이터 객체를 선언할 때 mutable
로 선언해버리면 된다.