(C++) mutable

Posted by : at

Category : Cpp


mutable

class Point
{
  int x, y;

  // mutable 선언
  mutable int cnt = 0;

public:
    Point(int a = 0, int b = 0) : x(a), y(b) {}

    void print() const
    {
        ++ cnt;   // 상수함수인데 private 변수 변경가능.
        std::cout << x << ", " << y << std::endl;
    }
};

Example

#include <iostream>
using namespace std;

int g = 10;

int main()
{
    int v1 = 0, v2 = 0;
    auto f1 = [](int a) { return a + g; }   
    // 람다표현식에서 전역변수에 접근이 가능? -> Okay, 읽고, 쓰고 모두 가능

    auto f2 = [](int a) { return a + v1; }      
    // error - 지역변수 접근에는 에러가 난다.

    auto f3 = [v1](int a) { return a + v1; }    
    // 지역변수 캡처를 지정해 줘야한다.

    auto f4 = [v1](int a) mutable { v1 = 10; }  
    // 값 캡쳐인데 
    // mutable을 쓰면 값 변경도 가능!
}
// 지역변수 캡처시 값변경은?
auto f1 = [v1, v2]() {v1 = 10; v2 = 20; }   
// error! -> operator()() const 상수이기에 변경 불가!

// mutable lambda : ()연산자 함수를 비상수 함수로
auto f1 = [v1, v2]() mutable {v1 = 10; v2 = 20; }
f1();

cout << v1 << endl;     // 0
cout << v2 << endl;     // 0
// 복사본을 변경했기에 원본은 변화가 없음.

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links