개발공부/모두의 코드 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