μ λ² ν¬μ€νΈμμ λ€λ£¬ λ³΅μ¬ λ°©μμ λμ μ°μ°μ μ€λ²λ‘λ©μ l-valueμ λν΄μ μλν©λλ€.
μ΄λ² ν¬μ€νΈμμ λ€λ£° μ΄λ λμ μ°μ°μ μ€λ²λ‘λ©μ r-valueλ₯Ό λ€λ£Ήλλ€.
λ€μ μ½λ μ‘°κ°μ μ΄ν΄λ΄ μλ€.
Mystring s1;
s1 = Mystring{"Ricky"}; // Move Assignment
μ¬κΈ°μ empty stringμ λ΄λ Mystring κ°μ²΄ s1μ μ μΈνμ΅λλ€.
κ·Έλ¦¬κ³ s1μ Mystring{"Ricky"}λ₯Ό ν΅ν΄μ RickyλΌλ λ¬Έμμ΄μ μμ±μΌλ‘ μ§λ Mystring κ°μ²΄λ₯Ό ν λΉνμ΅λλ€.
μ¬κΈ°μ μ€μν μ μ, s1μ κ°μ μ μ₯νκΈ° μν΄μ
μλ‘μ΄ μ΄λ¦ μλ μμ κ°μ²΄λ₯Ό λ§λ€κ³ , κ·Έ κ°μ s1μ μ μ₯μ ν λ€μ μμ κ°μ²΄λ₯Ό μ κ±°ν©λλ€.
μ΄κ²μ΄ r-value κ°μ²΄μ λλ€.
νμ§λ§ μμλ€μνΌ μ΄λ° μμ κ°μ²΄μ μμ±μ λ©λͺ¨λ¦¬μ μΈ‘λ©΄μμ λ§€μ° λΉν¨μ¨μ μ λλ€.
μ΄λ¬ν μ΄μ λ‘ μ°λ¦¬λ move assignment operatorλ₯Ό ꡬνν©λλ€.
κΈ°λ³Έμ μΈ syntaxλ λ€μκ³Ό κ°μ΅λλ€.
(μ΄ ν¬μ€νΈμμ μμλ‘ μ¬μ©νλ Mystring ν΄λμ€λ μ λ² ν¬μ€νΈμ μμΈν λμμμ΅λλ€.)
// syntax
Type &Type::operator=(Type &&rhs);
// example
Mystring &Mystring::operator=(Mystring &&rhs);
s1 = Mystring("Joe"); // move operator= called
s1 = "Ricky"; // move operator= called
Move assignment operatorμ μ½λ μ μλ₯Ό μ΄ν΄λ³ΌκΉμ?
Mystring &Mystring::operator=(Mystring &&rhs){
if (this == &rhs)
return *this;
delete [] this.str;
str = rhs.str;
rhs.str = nullptr;
return *this;
}
copy operatorκ³Ό λ§€μ° μ μ¬νμ§λ§,
deep copyλ°©μ λμ μ rhsμ μμ κ°μ²΄κ° κ°λ₯΄ν€λ ν¬μΈν°λ₯Ό κ°μ Έμ¨λ€λ μ°¨μ΄κ° μμ΅λλ€.
μ€μ€λ‘μ ν¬μΈν°λ₯Ό ν λΉ ν΄μ ν λ€,
str = rhs.str μΌλ‘ ν¬μΈν°λ₯Ό κ°μ Έμ΅λλ€.
μ΄ν, κ°μ Έμ¨ μμ€μΈ rhsμ ν¬μΈν°λ₯Ό nullptrλ‘ ν΄μ ν λ€,
*thisλ₯Ό ν΅ν΄μ νμ¬ κ°μ²΄λ₯Ό λ°νν©λλ€.
λ§μ½ μ¬κΈ°μ κ° μμ±μ νΉμ λμ μ°μ°μμ νΈμΆ μ μΆλ ₯νλλ‘ νκ² νκ³ ,
λ€μκ³Ό κ°μ λ©μΈ ν¨μλ₯Ό μ€ννλ€λ©΄ μ΄λ° κ²°κ³Όκ° λμ΅λλ€.
int main() {
Mystring s1;
s1 = Mystring("Ricky"); // move assignment
Mystring s2{s1}; // copy constructor
Mystring s3; // (no-args constructor)
s3 = s2; // copy assignment
return 0;
}
μ μν΄μΌ νλ μ μ Mystring s2{s1}κ³Ό Mystring s2 = s1;μ κ°μ κ²μΈλ°μ,
=κ° μκΈ° λλ¬Έμ assignment operatorκ° μ€νλ κ±°λΌκ³ μ°©κ°ν μ μμ΅λλ€.
νμ§λ§ κ·Έκ²μ μλκ³ κ°μ²΄μ μμ±μμμ = μ°μ°μλ μ°λ¦¬κ° κΈ°μ‘΄μ μ¬μ©νλ λμ μ°μ°μμ ννλ‘ μ€νλ©λλ€.
μ°λ¦¬κ° μ€λ²λ‘λ©ν λμ μ°μ°μμ νμ©μ νΉμ κ°μ²΄μ μμ± μ΄ν,
ν΄λΉ κ°μ²΄μ λνμ¬ λμ μ°μ°μ μ€ν νμλ μ€νλ©λλ€.
'C++ > κΈ°ν' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C++] λμ μ°μ°μ μ€λ²λ‘λ© (볡μ¬) | Assignment Operator Overloading (copy) (0) | 2024.01.09 |
---|---|
[C++] μ°μ°μ μ€λ²λ‘λ© | Operator Overloading (1) | 2024.01.08 |
[C++] cin.ignore() (0) | 2023.12.28 |
[C++] vscode λλ²κΉ μΈν κΈ°λ‘ (0) | 2023.12.23 |
[C++] μΆκ°μ μΈ λ³μ μ μΈ μμ΄ κ° κ΅ννκΈ° (swap) (1) | 2023.12.19 |