업무에서 c++을 이용하게 되었다!.... 기억이 나질 않는데.. 다시 공부를 하려니 모르는게 계속 나오고 있다.
c++에서 Explicit 키워드가 존재한다(implicit은 default)
컴파일러는 기본적으로 함수에 적용될 때, 최적의 실행가능한 조건? 을 찾아서 실행한다.
문자열을 통해 실행하는 어떤 함수가 존재한다
DoSomeThing(MyClass s)
하지만 기존 클래스에 다음과 같이 int를 인자로 받는 생성자가 존재한다면
MyClass(int size);
DoSomeThing(MyClass(3))
다음과 같이 실행되며 원하지 않는 변환이 일어나게 된다.
위와 같은 상황을 막기 위하여 함수의 선언에 있어
MyClass(int size)가 로 선언하는게 아닌 explicit 키워드를 추가하여
explicit MyClass(int size)와 같이 선언함으로써 암시적(implicit)변환을 막을 수 있다.
기본적으로 const 함수 내부에서 멤버변수의 값을 바꾸는 것을 불가능하다.
Mutable 키워드는 const 함수 내부에서 멤버변수들의 값을 바꾸는 것을 가능하게 해준다.
#include <iostream>
class A {
int data_;
public:
A(int data) : data_(data) {}
void DoSomething(int x) const {
data_ = x; // 불가능!
}
void PrintData() const { std::cout << "data: " << data_ << std::endl; }
};
int main() {
A a(10);
a.DoSomething(3);
a.PrintData();
}
위와 같이 선언되어 있는 class는 컴파일 에러가 발생한다
const 함수의 내부 값을 변경하려고 하기 때문이다.
하지만 int data_ 멤버변수의 앞에
mutalbe int data_; 와 같이 선언을 한다면 이용가능하다
위와 같은 경우를 이용하는 케이스로 캐시를 이용할 때가 존재한다. 함수자체를 const로 선언되어 멤버변수의 값에 대한 변경을 막아 놓지만 cache의 데이터를 변경하기 위해서 mutable cache로 선언하여 이용하는 경우이다.
class Server {
// .... (생략) ....
Cache cache; // 캐쉬!
// 이 함수는 데이터베이스에서 user_id 에 해당하는 유저 정보를 읽어서 반환한다.
User GetUserInfo(const int user_id) const {
// 1. 캐쉬에서 user_id 를 검색
Data user_data = cache.find(user_id);
// 2. 하지만 캐쉬에 데이터가 없다면 데이터베이스에 요청
if (!user_data) {
user_data = Database.find(user_id);
// 그 후 캐쉬에 user_data 등록
cache.update(user_id, user_data); // <-- 불가능
}
// 3. 리턴된 정보로 User 객체 생성
return User(user_data);
}
};
cpp 할게 많다...
글 잘 봤습니다.