はじめに
C++やC言語の構造体(struct
)で、ある変数の内容を、別の変数にそっくりそのままコピーしたい場合があります。メンバを一つずつ destination.id = source.id;
のようにコピーしていくことも可能ですが、メンバの数が多いと非常に手間がかかります。
幸い、C++/C言語では、同じ型の構造体変数同士であれば、代入演算子(=
)を使って、全てのメンバを一度の操作で丸ごとコピーすることができます。
この記事では、構造体変数同士の代入(一括コピー)の基本的な使い方を、サンプルコードと共に解説します。
構造体を一括コピーするサンプルコード
このコードは、Book
(本)という構造体を定義し、originalBook
という変数に情報を設定した後、その内容を =
を使って copiedBook
という別の変数に一括でコピーします。
完成コード
#include <iostream>
#include <string>
// 「本」構造体の定義
struct Book {
std::string title; // タイトル
std::string author; // 著者
int price; // 価格
};
int main() {
// 1. コピー元の構造体変数を準備
Book originalBook;
originalBook.title = "C++プログラミング入門";
originalBook.author = "山田 太郎";
originalBook.price = 2800;
// 2. コピー先の構造体変数を宣言
Book copiedBook;
// 3. 代入演算子(=)で、全メンバを一括コピー
copiedBook = originalBook;
// 4. コピーされた内容を確認
std::cout << "コピーされた書籍情報" << std::endl;
std::cout << "タイトル: " << copiedBook.title << std::endl;
std::cout << "著者: " << copiedBook.author << std::endl;
std::cout << "価格: " << copiedBook.price << "円" << std::endl;
return 0;
}
実行結果
コピーされた書籍情報
タイトル: C++プログラミング入門
著者: 山田 太郎
価格: 2800円
コードの解説
copiedBook = originalBook;
この一行が、この記事の核心部分です。
originalBook
に格納されている全てのメンバ(title
,author
,price
)の値が、copiedBook
の対応する各メンバに一つずつ自動的にコピーされます。- これは、内部的には以下のような処理をコンパイラが自動で行ってくれているのと同じです。C++
// copiedBook = originalBook; は、以下の処理と等価 copiedBook.title = originalBook.title; copiedBook.author = originalBook.author; copiedBook.price = originalBook.price;
この「メンバごとのコピー(member-wise copy)」の仕組みにより、コードを非常に簡潔に記述できます。
注意点
この単純なコピーは、構造体のメンバが int
や std::string
のような基本的なデータ型で構成されている場合には問題なく機能します。
しかし、ポインタをメンバとして持つ構造体を扱う場合は注意が必要です。=
によるコピーは、ポインタが指し示す先(メモリ上の実データ)をコピーするのではなく、ポインタのアドレス値そのものをコピーします(浅いコピー)。これにより、2つの構造体が同じメモリ領域を指してしまい、予期せぬ問題を引き起こす可能性があります。ポインタを扱う場合は、必要に応じて自分で深いコピー(ディープコピー)を実装する必要があります。
まとめ
今回は、代入演算子 =
を使って、構造体の内容を別の構造体変数に一括でコピーする方法を解説しました。
- 同じ型の構造体変数同士は、
=
で全メンバの値をコピーできる。 - これをメンバワイズコピーと呼ぶ。
- ポインタをメンバに持つ場合は、挙動(浅いコピー)に注意が必要。
メンバを一つずつコピーする冗長なコードを書く必要はなく、=
を使うだけでスマートに構造体の複製が可能です。ぜひ活用してください。