operator_assignment — 대입 연산자
operator_assignment — 대입 연산자 (Assignment operators)
**대입 연산자(assignment operator)**는 객체에 값을 저장하는 연산자들이에요. 단순 대입 =와 복합 대입(+=, -= 등)이 있어요.
객체에 새 값을 넣을 때 사용해요. 내장 타입뿐 아니라 클래스에서 오버로드해 정의할 수 있어요(복사 대입, 이동 대입).
출처: cppreference
본문
대입 연산자는 오른쪽 피연산자의 값을 왼쪽 피연산자로 저장해요.
단순 대입
lvalue = value
x = 5;처럼 값을 저장하고, 결과로 왼쪽의 lvalue 참조에 대한 값을 냅니다. 대입은 오른쪽에서 왼쪽으로 결합돼요 (a = b = c → a = (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)하면 객체를 복사할 수 없어요.