참고한 것들
코드 예시
- Copy assignment operator (복사 대입 연산자) 는 이름은 거창하지만, 그냥
=
이다. - 다만 C++ 에서는 이
=
를 사용할 때의 작동 과정을 명시할 수 있다는 것. - 아래 코드를 보자.
#include <iostream>
#include <string>
class Example {
private:
std::string name_;
public:
Example(std::string name) : name_(name) {}
Example& operator=(Example& other);
inline void Print() { std::cout << this->name_ << std::endl; }
};
Example& Example::operator=(Example& other) {
std::cout << "Copy assignment operator called: this(" << this->name_ <<
"), other(" << other.name_ << ")" << std::endl;
this->name_ += "_from_" + other.name_;
return *this;
}
int main() {
Example ex1("ex1");
Example ex2("ex2");
ex2 = ex1;
ex2.Print();
}
Copy assignment operator called: this(ex2), other(ex1)
ex2_from_ex1
- 위 예제는 copy assignment 된 객체는
"{{ 원래 이름 }}_from_{{ 상대방 이름 }}"
으로 이름이 변경되도록 한 것이다. - 보다시피, 선언은
ClassName operator=(ClassName var_name)
형태이다.- 즉, 동 class object 를 받아 동 class object 를 반환하고
- 함수 이름은
operator=
이어야 한다. - 동 class object 는 value type 도 되고 reference type 도 된다.
- 다만, 인자는
const
타입이면 안된다고 한다.
Copy construct 와 Copy assignment operator
- 주의할 것은, Copy assignment operator 는 (당연히) constructor 가 아니라는 점이다.
- 따라서 object 선언시에 초기화를 위한
=
는 copy assignment operator 가 아니라 copy constructor 가 호출되고 - Constructor 에서 사용할 수 있는
: var_name(var_name)
와 같은 member initializer list 는 여기서는 사용하지 못한다는 점이다.
- 따라서 object 선언시에 초기화를 위한
- 가령, 다음의 예시에서는:
#include <iostream>
#include <string>
class Example {
private:
std::string name_;
public:
Example(std::string name) : name_(name) {}
Example& operator=(Example& other);
Example(Example& other);
inline void Print() { std::cout << this->name_ << std::endl; }
};
Example& Example::operator=(Example& other) {
std::cout << "Copy assignment operator called: this(" << this->name_ <<
"), other(" << other.name_ << ")" << std::endl;
this->name_ += "_from_" + other.name_;
return *this;
}
Example::Example(Example& other) : name_(other.name_ + "_copied") {
std::cout << "Copy constructor called: this(" << this->name_ <<
"), other(" << other.name_ << ")" << std::endl;
}
int main() {
Example ex1("ex1");
Example ex2("ex2");
Example ex3 = ex1;
ex2 = ex1;
ex1.Print();
ex2.Print();
ex3.Print();
}
- 다음과 같이 출력된다:
Copy constructor called: this(ex1_copied), other(ex1)
Copy assignment operator called: this(ex2), other(ex1)
ex1
ex2_from_ex1
ex1_copied