https://www.learncpp.com/cpp-tutorial/overloading-the-assignment-operator/
assignment operator(=)는 object로 부터 이미 존재하는 object로 value를 copy하기 위해 사용한다
둘은 매우 유사하나 copy constructor는 initialization에서 사용되고
assignment는 존재하는 object를 다른 object를 이용해 대체할 때 사용한다
#include <cassert>
#include <iostream>
class Fraction
{
private:
int m_numerator { 0 };
int m_denominator { 1 };
public:
// Default constructor
Fraction(int numerator = 0, int denominator = 1 )
: m_numerator(numerator), m_denominator(denominator)
{
assert(denominator != 0);
}
// Copy constructor
Fraction(const Fraction& copy)
: m_numerator { copy.m_numerator }, m_denominator { copy.m_denominator }
{
// no need to check for a denominator of 0 here since copy must already be a valid Fraction
std::cout << "Copy constructor called\n"; // just to prove it works
}
// Overloaded assignment
Fraction& operator= (const Fraction& fraction);
friend std::ostream& operator<<(std::ostream& out, const Fraction& f1);
};
std::ostream& operator<<(std::ostream& out, const Fraction& f1)
{
out << f1.m_numerator << "/" << f1.m_denominator;
return out;
}
// A simplistic implementation of operator= (see better implementation below)
Fraction& Fraction::operator= (const Fraction& fraction)
{
// do the copy
m_numerator = fraction.m_numerator;
m_denominator = fraction.m_denominator;
// return the existing object so we can chain this operator
return *this;
}
int main()
{
Fraction fiveThirds { 5, 3 };
Fraction f;
f = fiveThirds; // calls overloaded assignment
std::cout << f;
return 0;
}
operator overloading으로 (=) operator를 정의해서 사용하면 된다
main을 보면 f = fiveThirds로 이러한 경우에 assignment operator가 사용된다
이에 관한 내용은 생략하도록 하겠다
다른 operator와 달리 compiler는 default public assignment operator를 제공한다
만약 우리가 정의하지 않았을 경우
이는 This assignment operator does memberwise assignment (which is essentially the same as the memberwise initialization that default copy constructors do).
다른 operator와 마찬가지로 private로 설정해서 사용하지 못하게 하거나
delete 키워드를 이용해 막아버릴 수 있다
#include <cassert>
#include <iostream>
class Fraction
{
private:
int m_numerator { 0 };
int m_denominator { 1 };
public:
// Default constructor
Fraction(int numerator = 0, int denominator = 1)
: m_numerator { numerator }, m_denominator { denominator }
{
assert(denominator != 0);
}
// Copy constructor
Fraction(const Fraction ©) = delete;
// Overloaded assignment
Fraction& operator= (const Fraction& fraction) = delete; // no copies through assignment!
friend std::ostream& operator<<(std::ostream& out, const Fraction& f1);
};
std::ostream& operator<<(std::ostream& out, const Fraction& f1)
{
out << f1.m_numerator << "/" << f1.m_denominator;
return out;
}
int main()
{
Fraction fiveThirds { 5, 3 };
Fraction f;
f = fiveThirds; // compile error, operator= has been deleted
std::cout << f;
return 0;
}
위에서 assignment operator를 delete로 막아버렸으므로
f= fiveThirds에서 compile error가 발생한다