13.15 Overloading the assignment operator
https://www.learncpp.com/cpp-tutorial/overloading-the-assignment-operator/
割り当てオペレータ(=)は、オブジェクトから既存のオブジェクトに値をコピーするために使用します.
両者は非常に似ていますが、copy構造関数は初期化に使用されます.
割り当ては、存在するオブジェクトを別のオブジェクトに置き換えるために使用されます.
mainはf=fiveThirdsで、この場合は付与オペレータを使用します
関連内容は省略する
他のオペレータとは異なり、コンパイラはdefault共通割り当てオペレータを提供します.
定義がなければ
これは、デフォルトのcopyコンストラクション関数のmemberwise初期化と同じです.
他のオペレータと同様にprivateに設定して無効にします.
deleteキーを使用してブロックできます
f=fiveThirdsコンパイルエラー発生
割り当てオペレータ(=)は、オブジェクトから既存のオブジェクトに値をコピーするために使用します.
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 ©) = 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コンパイルエラー発生
Reference
この問題について(13.15 Overloading the assignment operator), 我々は、より多くの情報をここで見つけました https://velog.io/@ikmy0ung/13.15-Overloading-the-assignment-operatorテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol