operator_assignment — 대입 연산자

operator_assignment — 대입 연산자 (Assignment operators)

**대입 연산자(assignment operator)**는 객체에 값을 저장하는 연산자들이에요. 단순 대입 =와 복합 대입(+=, -= 등)이 있어요.

객체에 새 값을 넣을 때 사용해요. 내장 타입뿐 아니라 클래스에서 오버로드해 정의할 수 있어요(복사 대입, 이동 대입).

출처: cppreference

본문

대입 연산자는 오른쪽 피연산자의 값을 왼쪽 피연산자로 저장해요.

단순 대입

lvalue = value

x = 5;처럼 값을 저장하고, 결과로 왼쪽의 lvalue 참조에 대한 값을 냅니다. 대입은 오른쪽에서 왼쪽으로 결합돼요 (a = b = ca = (b = c)).

복합 대입

lvalue += rhs      // lvalue = lvalue + rhs
lvalue -= rhs
lvalue *= rhs
lvalue /= rhs
...

x += 3;x = x + 3;과 동등해요. 산술(+= -= *= /= %=), 비트(&= |= ^= <<= >>=) 복합 대입이 있어요.

대입 연산자의 결과

대입 표현식의 값은 왼쪽 피연산자가 저장된 후의 값이에요. 그래서 체이닝이 가능해요.

int a, b;
a = b = 5;   // b = 5, 그 후 a = 5

클래스의 대입 연산자

클래스는 operator=를 오버로드해 복사/이동 대입을 정의해요.

  • 복사 대입 연산자T& operator=(const T&)
  • 이동 대입 연산자T& operator=(T&&)
struct Vec {
    int* data = nullptr;
    std::size_t n = 0;
    Vec& operator=(const Vec& other) {   // 복사 대입
        if (this != &other) { /* deep copy */ }
        return *this;
    }
};

암시적 대입 연산자

클래스에 정의가 없으면 컴파일러가 멤버별 복사/이동 대입 연산자를 암시적으로 생성해요.

자기 대입

복사/이동 대입에서 a = a;(자기 대입)가 안전해야 해요. 자원을 먼저 해제하는 구현이라면 자기 대입 시 문제가 생길 수 있어, guard를 넣는 것이 관례예요.

if (this != &other) { ... }

노트 (Notes)

  • =를 사용하는 복사 초기화(T x = y)는 대입이 아니라 초기화예요. 두 개념은 달라요.
  • 대입과 초기화를 구분하는 것이 중요해요.
  • 복사 대입 연산자를 명시적으로 삭제(= delete)하면 객체를 복사할 수 없어요.

더 알아보기 (Learn more)

cppreference