13.15 Overloading the assignment operator


https://www.learncpp.com/cpp-tutorial/overloading-the-assignment-operator/
割り当てオペレータ(=)は、オブジェクトから既存のオブジェクトに値をコピーするために使用します.

Assignment vs Copy constructor


両者は非常に似ていますが、copy構造関数は初期化に使用されます.
割り当ては、存在するオブジェクトを別のオブジェクトに置き換えるために使用されます.

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;
}
演算子を再ロードし、演算子(=)を定義して使用します.
mainはf=fiveThirdsで、この場合は付与オペレータを使用します

self assignment


関連内容は省略する

Default assignment operator


他のオペレータとは異なり、コンパイラはdefault共通割り当てオペレータを提供します.
定義がなければ
これは、デフォルトのcopyコンストラクション関数のmemberwise初期化と同じです.
他のオペレータと同様に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;
}
上はdeleteで割り当てオペレータをブロックしました.
f=fiveThirdsコンパイルエラー発生