암시적 변환
void DoSomethingWithString(MyString s) { // Do something... }
DoSomethingWithString(MyString("abc"))
이건 당연하게 가능하다.
DoSomethingWithString("abc")
이것도 신기하게도 가능하다.
- "
abc
" 는MyString
타입이 아니다. 그런데 C++ 컴파일러는 꽤나 똑똑해서 "abc
" 를 어떻게 하면MyString
으로 바꿀 수 있는지 생각해봅니다.
- 다행히 생성자 중에
MyString(const char* str);
이게 있어서 자동으로 바꿔줬다.
- 이것이 언제나 편리한 것은 아니다. 사용자가 의도하지 않은 암시적 변환이 일어나게 되는 경우가 있기 때문이다.
- 이것을 해결하기 위해 우리는 암시적으로 변환이 일어나는 것을 막는 키워드를 사용할 수가 있습니다.
explicit
explicit MyString(int capacity);
위와 같이 사용하면 된다.
이렇게 사용하면 암시적 변환이 일어나지 않는다.
explicit키워드는 복사 생성자의 형태로도 호출되는 것을 막게 된다.MyString s(5); // 허용 MyString s = 5; // 컴파일 오류!
mutable(변이가능한)
예시 안되는 코드
#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();
}
되는 수정코드
#include <iostream>
class A
{
mutable 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();
}
mutable이 필요한 이유
- 객체의 내부상태에 영향을 끼치지 않기 위해서 const로 함수를 선언한다.
- 단 ..! 정보를 데이터에서 빼오는 과정에서 데이터는 건들지 않지만 일반적으로 서버는 메모리에 캐쉬(cash)를 만들어서 자주 요청되는 데이터를 굳이 데이터베이스까지 가서 찾지 않아도 빠르게 조회 할 수 있게 한다.
- 이 과정에서 읽을때 캐쉬를 이용해야하기 때문에 캐쉬를 보통 mutable로 사용하게 된다.
- 따라서 보통 캐쉬같이 사용자 입장에서는 const가 당연한 것들이고 구현 하는 방면에서 cash를 사용하는경우 캐쉬만 mutable로 선언해준다.
Uploaded by
N2T728x90
'CPP' 카테고리의 다른 글
[Cpp 개념공부] 상속 (함수 오버라이딩, 상속 접근지시자) (0) | 2023.02.10 |
---|---|
[cpp 개념공부]연산자 오버로딩 (사용자 지정 연산자, 대입연산자, 입출력 오버로딩 ,첨자 연산자 Wrapper class) (1) | 2023.02.06 |
[c++개념공부]복사 생성자 (깊은복사 얕은복사), 소멸자 (0) | 2023.01.27 |
[c++개념공부]함수 오버로딩, 생성자, default (0) | 2023.01.27 |
[c++개념공부]참조자와 이름공간 (0) | 2023.01.27 |