C++の代入コンストラクターとコピーコンストラクターの違いがわかりません。次のようなものです。
class A {
public:
A() {
cout << "A::A()" << endl;
}
};
// The copy constructor
A a = b;
// The assignment constructor
A c;
c = a;
// Is it right?
割り当てコンストラクタのメモリを割り当て、コンストラクタをコピーする方法を知りたいですか?
copy constructorは、以前は初期化されていなかった他のオブジェクトのデータからのオブジェクト。
A(const A& rhs) : data_(rhs.data_) {}
例えば:
A aa;
A a = aa; //copy constructor
代入演算子は、のデータを置き換えるために使用されます以前に初期化されたオブジェクトと他のオブジェクトのデータ。
A& operator=(const A& rhs) {data_ = rhs.data_; return *this;}
例えば:
A aa;
A a;
a = aa; // assignment operator
コピーの構成をデフォルトの構成と割り当てで置き換えることもできますが、効率は低下します。
(補足:上記の私の実装は、コンパイラが無料で許可するものであるため、手動で実装することはあまり意味がありません。これら2つのいずれかがある場合は、何らかのリソースを手動で管理している可能性があります。その場合、The Three of Ruleごとに、もう1つとデストラクタも必要になるでしょう。
コピーコンストラクターと代入演算子の違いは、新しいプログラマーにとって大きな混乱を引き起こしますが、実際にはそれほど難しくありません。要約:
代入演算子の例:
Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator
コピーコンストラクタの例:
Base obj1(5);
Base obj2 = obj1; //calls copy constructor
1つ目はコピーの初期化、2つ目は単なる割り当てです。代入コンストラクターなどはありません。
A aa=bb;
コンパイラーが生成したコピーコンストラクターを使用します。
A cc;
cc=aa;
デフォルトのコンストラクタを使用してcc
を構築し、次に既存のオブジェクトに対して*割り当て演算子**(operator =
)を構築します。
割り当てコンストラクタのメモリを割り当て、コンストラクタをコピーする方法を知りたいですか?
この場合、メモリを割り当てるという意味のIDKですが、何が起こるかを見たい場合は、次のことができます。
class A
{
public :
A(){ cout<<"default constructor"<<endl;};
A(const A& other){ cout<<"copy constructor"<<endl;};
A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};
また、以下をご覧になることをお勧めします。
コピーコンストラクターと割り当てコンストラクターの違いは次のとおりです。
<classname> <o1>=<o2>
)<o1>=<o2>
)に適用されます。そして両方の基本的な機能は同じで、メンバーごとにo2からo1にデータをコピーします。
@Luchian Grigore Saidがこのように実装されているもの
class A
{
public :
int a;
A(){ cout<<"default constructor"<<endl;};
A(const A& other){ cout<<"copy constructor"<<endl;};
A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};
void main()
{
A sampleObj; //Calls default constructor
sampleObj.a = 10;
A copyConsObj = sampleObj; //Initializing calls copy constructor
A assignOpObj; //Calls default constrcutor
assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}
出力
デフォルトコンストラクタ
コピーコンストラクタ
デフォルトコンストラクタ
代入演算子
このトピックについてもう1つポイントを追加したいと思います。 「代入演算子の演算子関数は、クラスのメンバー関数としてのみ記述する必要があります。」他の二項演算子や単項演算子とは異なり、フレンド関数として作成することはできません。
簡単に言えば、
コピーコンストラクターは、既存のオブジェクトのコピーとして、既存のオブジェクトから新しいオブジェクトが作成されるときに呼び出されます。また、すでに初期化されたオブジェクトに別の既存のオブジェクトから新しい値が割り当てられると、代入演算子が呼び出されます。
例
t2 = t1; // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1; // calls copy constructor, same as "Test t3(t1);"
コピーコンストラクタについて追加するもの:
値でオブジェクトを渡すとき、コピーコンストラクタを使用します
オブジェクトが値によって関数から返されるとき、コピーコンストラクタを使用します
別のオブジェクトの値を使用してオブジェクトを初期化するとき(例として)。