13.15 Overloading the assignment operator

주홍영·2022년 3월 18일
0

Learncpp.com

목록 보기
158/199

https://www.learncpp.com/cpp-tutorial/overloading-the-assignment-operator/

assignment operator(=)는 object로 부터 이미 존재하는 object로 value를 copy하기 위해 사용한다

Assignment vs Copy constructor

둘은 매우 유사하나 copy constructor는 initialization에서 사용되고
assignment는 존재하는 object를 다른 object를 이용해 대체할 때 사용한다

Overloading the assignment operator

#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가 사용된다

self assignment

이에 관한 내용은 생략하도록 하겠다

Default 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 &copy) = 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가 발생한다

profile
청룡동거주민

0개의 댓글