❤恋するコンピュータサイエンス❤

コンピュータサイエンス、3DCGをもっと楽しく、もっと本質的に!c言語、c++の記事中心です

コピーコンストラクタと代入演算子による初期化

Q.

コピーコンストラクタと代入の違いを説明せよ。

 

A.
コンストラクタには、コピーコンストラクと言うコンストラクタがあり、
コピーコンストラクタの書式は,

クラス名 (const &obj)


のように定義する.

引数に同名の参照を指定します。
コピーコンストラクタの仮引数は、
自身のクラスの const参照か、
非const参照とします。
この引数は、コピー元のオブジェクトを参照するものです。
コピー元を変更する必要はないので、const参照にするのが普通です。

コピーコンストラクタが登場するのは初期化の時です。

Class b = a;  // a をコピーして b を作る

 

新しいオブジェクトが作られるときにはコンストラクタが呼び出されますが、
コピーによって生成する場合には、コピーコンストラクタという特殊なコンストラクタが呼び出されます。
何故コピーコンストラクタが必要かといえば、「アドレスの共有・勝手な書き換え」が問題なる場合があるからです。
詳しくは下記参照

コピーコンストラクタはなぜ必要か?【C++】

 

代入演算子

代入演算子の書式は,

A& operator = (const A& obj)//Aはクラス名


ここで、Aはクラス名を表します。代入演算子は、右辺のオブジェクトを左辺のオブジェクトにコピーするために使用されます。通常、代入演算子はクラスのメンバ変数やリソースを適切にコピーするために定義されます

クラス型のオブジェクトの代入によって、コピーを行うとき、そのクラス用に定義された代入演算子が使用されます。

Class a, b;
a = b;  // b を実引数として、operator= を呼ぶ

代入演算子の定義は、クラスの振る舞いやリソース管理に重要な役割を果たします。クラスがポインタメンバやリソースを持つ場合、デフォルトの代入演算子では単純なポインタのコピーが行われるだけであり、意図しない動作やリソースリークの原因となる可能性があります。そのため、クラスがリソースを所有している場合には、適切な代入演算子を定義する必要があります

 

デフォルトでは、コンパイラが自動的に生成した代入演算子が使われ、この動作はすべてのメンバ変数を1つ1つコピーするというものです。

 


下記参照

CPP事始め: コピーコンストラクタ,代入演算子 - Qiita