본문 바로가기
Language/C++

[c++][씹어먹는 C ++ ]4.6 클래스의 explicit 과 mutable

by 담백로봇 2024. 4. 22.

출처: https://modoocode.com/253


키워드:

  • explicit
  • mutable 

explicit

C++에서 explicit 키워드의 필요성은 주로 형 변환 연산자와 생성자에서 발생.

  1. 묵시적 변환 방지: explicit 키워드는 묵시적인 변환을 방지. 예를 들어, 한 개체를 다른 유형으로 변환하는 생성자나 형 변환 연산자가 explicit으로 표시되어 있으면, 컴파일러는 이러한 변환을 자동으로 수행하지 않음. 이는 의도치 않은 동작을 방지하고 코드의 명확성을 향상.
class MyClass {
public:
    explicit MyClass(int value) : data(value) {} // 명시적 생성자

private:
    int data;
};

void func(MyClass obj) {
    // 함수 내에서 MyClass 객체를 사용
}

int main() {
    MyClass obj = 10; // 컴파일 오류, 명시적 생성자를 호출해야 함
    func(10); // 컴파일 오류, 명시적 생성자를 호출해야 함
    return 0;
}

 

여기서 올바른 생성자 호출법은 아래 처럼 정확하게 생성자를 호출해줘야함.

 

int main() {
    MyClass objExplicit = MyClass(10); // 명시적 생성자 호출
    func(MyClass(10)); // 명시적 생성자 호출
    return 0;

 


mutable 

mutable 키워드는 C++에서 클래스 멤버 변수를 변경 가능하게 하는 데 사용. 보통 클래스의 멤버 변수는 해당 클래스의 객체가 변경되면 값도 함께 변경. 그러나 mutable 키워드로 표시된 멤버 변수는 객체의 불변성(invariant)을 유지하면서도 상태가 변경될 수 있음

 

mutable 키워드가 필요한 주요 경우 예

  1. 불변 객체 내부의 상태 변경: 불변 객체의 경우 내부 상태를 변경할 수 없지만, 일부 상황에서는 내부적인 상태를 변경해야 할 수 있다. mutable 키워드를 사용하여 불변 객체 내부의 특정 변수를 변경 가능하게 표시함으로써 객체의 불변성을 유지하면서 내부적인 상태를 변경
class Cache {
public:
    int getValue() const {
        if (!isCached) {
            cachedValue = computeValue(); // 캐싱된 값 계산
            isCached = true;
        }
        return cachedValue;
    }

private:
    mutable int cachedValue; // 캐싱된 값
    mutable bool isCached = false; // 캐시 여부
    int computeValue() const {
        // 계산 비용이 많이 드는 연산
        return 42;
    }
};

-> 계산 비용이 많이 드는 연산의 결과를 캐싱하여 성능을 향상시키는 경우의 예제이다. 잘사용하진않지만 알아놓으면 좋다

댓글