개발공부/모두의 코드 C++
C++ 기초개념 4-6 : explicit과 mutable 키워드
수박 서리
2022. 11. 22. 11:24
이글은 c++를 복습하기 위해 모두의 코드 https://modoocode.com/ 있는 강의 글을 보고 중요한 것들을 기록한 것입니다.
explicit 키워드
explicit 키워드는, 간단히 말해 암시적 형 변환을 허용하지 않을 때 붙여주는 키워드이다.
이전에 만들었던 MyString 클래스를 예를 들어 다음과 같은 생성자와 함수를 추가해보자.
MyString::MyString(int capacity) {
string_content = new char[capacity];
string_length = 0;
memory_capacity = capacity;
std::cout << "Capacity : " << capacity << std::endl;
}
MyString s1 = MyString(5);
MyString s2 = 5;
explicit 키워드가 없으면 잘 작동한다.
s2 = 5는 언뜻 보면 타입이 달라 불가능할 것 같지만, 컴파일러는 s1의 호출처럼 5를 암시적 형변환(implicit conversion)을 통해 int 타입을 받는 생성자를 호출하는 것이다.
여기에 이제 explicit 를 붙여보자
public:
// capacity 만큼 미리 할당함. (explicit 키워드에 주목)
explicit MyString(int capacity);
.
.
.
MyString s3 = 5; // 에러가 뜬다.
타입에 맞게 변환을 할 수 없어 에러가 뜬다.
mutable 키워드
const 함수 내부에서는 멤버 변수들의 값을 바꾸는 것이 불가능하다. 하지만, 만약에 멤버 변수를 mutable로 선언하였다면 const 함수에서도 이들 값을 바꿀 수 있다.
#include <iostream>
class A {
int data_;
mutable int data_m;
public:
A(int data) : data_(data) {}
void DoSomething(int x) const {
data_ = x; // 불가능!
data_m = x; // 가능!
}
void PrintData() const { std::cout << "data: " << data_ << std::endl; }
};
int main() {
A a(10);
a.DoSomething(3);
a.PrintData();
}
const로 정의된 DoSomething함수에서는 mutable로 정의된 data_m 의 값만 변경할 수 있다.
그럼 왜 mutable을 사용할까? (정리된 블로그 글을 대신 링크합니다) https://koreanfoodie.me/823