C++を学習していると、コピーコンストラクタで「Class名(const クラス名& other)」のような記述を見かけることがあります。特に「otherとは何を指しているのか」「なぜ&やconstが付いているのか」と疑問に感じる初心者は少なくありません。この記事では、コピーコンストラクタの引数で使われるotherの意味や役割について、具体例を交えながら分かりやすく解説します。
C++のコピーコンストラクタとは何か
コピーコンストラクタとは、すでに存在する同じクラスのオブジェクトを元にして、新しいオブジェクトを作成するときに呼び出される特殊なコンストラクタです。
例えば、あるクラスのオブジェクトAをコピーして、別のオブジェクトBを作成する場合にコピーコンストラクタが利用されます。
基本的なコピーコンストラクタの形は以下のようになります。
クラス名(const クラス名& other){}
ここで登場する「other」が、コピー元となるオブジェクトを受け取るための引数になります。
コピーコンストラクタのotherは何を表しているのか
otherは特別な予約語ではなく、単なる変数名です。プログラマーが自由に名前を付けることができます。
つまり、以下のように書いても同じ意味になります。
ClassName(const ClassName& other)
ClassName(const ClassName& src)
ClassName(const ClassName& original)
これらの違いは変数名だけで、どれも「コピー元のオブジェクトを受け取る」という役割を持っています。
一般的には「他のオブジェクト」という意味でotherという名前がよく使われています。
const クラス名& otherのそれぞれの意味
「const クラス名& other」という記述は、それぞれに意味があります。
| 記述 | 意味 |
|---|---|
| クラス名 | コピー元と同じ種類のオブジェクトを受け取る |
| & | 参照渡しをする |
| const | コピー元のオブジェクトを変更しない |
| other | コピー元オブジェクトを指す変数名 |
例えば、Personクラスのコピーコンストラクタなら以下のようになります。
class Person {
public:
Person(const Person& other);
};
この場合、otherはコピーされる前のPersonオブジェクトを指しています。
具体例で見るotherの役割
例えば、名前を保存するPersonクラスがあるとします。
class Person {
public:
string name;
Person(const Person& other){
name = other.name;
}
};
この場合、other.nameはコピー元オブジェクトのnameを意味します。
次のような処理を考えてみます。
Person a;
a.name = "Taro";
Person b = a;
「Person b = a;」が実行されると、コピーコンストラクタが呼ばれます。そのときotherにはaが渡されます。
つまり内部的には「other.nameから値を取り出して、bのnameへコピーする」という処理になります。
なぜコピーコンストラクタの引数に参照(&)を使うのか
コピーコンストラクタでは通常、引数を参照渡しにします。理由は、無駄なコピーを発生させないためです。
もし以下のように書いた場合を考えます。
ClassName(ClassName other)
この場合、コピーコンストラクタを呼ぶために引数otherを作る必要があります。しかし、そのotherを作るためにコピーコンストラクタが呼ばれるという循環が発生してしまいます。
そのため、コピーコンストラクタでは「元のオブジェクトそのものを参照する」という形で渡します。
なぜconstを付ける必要があるのか
constを付けることで、コピー元のオブジェクトを誤って変更しないことを保証できます。
コピー処理では通常、元のオブジェクトの情報を読み取るだけで、変更する必要はありません。そのためconstを付けるのが一般的です。
例えば、以下の場合otherの内容を書き換えることはできません。
Person(const Person& other){
other.name = "test"; // エラー
}
このように、constによって安全なコピー処理を実現できます。
まとめ|C++のコピーコンストラクタのotherはコピー元オブジェクトを表す
C++のコピーコンストラクタで使われる「other」は、コピー元となる同じクラスのオブジェクトを受け取るための変数名です。
otherという名前自体には特別な意味はなく、srcやoriginalなど別の名前に変更することもできます。ただし、一般的にはコピー対象以外の「別のオブジェクト」という意味でotherがよく使われています。
また、「const クラス名& other」という形は、コピー元を安全かつ効率的に受け取るためのC++で一般的な書き方です。この仕組みを理解すると、コピーコンストラクタやオブジェクト管理の理解がより深まります。


コメント