Cpp クラス コピーコンストラクタのソースを表示
新しいページはコチラ
移動:
案内
,
検索
[[C PlusPlus|C++]]に戻る <table class="mbox-small" style="border:1px solid #aaa; background-color:#f9f9f9; width:22em;" id="RealTitleBanner"> <tr> <td style="width:1px;"></td> <td class="mbox-text plainlist" style="">本来の表記は「<b><span id="RealTitle" style="font-size:large;">C++ クラス コピーコンストラクタ</span></b>」です。この記事に付けられた題名は{{記事名の制約}}から不正確なものとなっています。</td> </tr> </table> ※このページでは[[C PlusPlus|C++]]にのみ存在する機能として、記事タイトルが<nowiki>C++ クラス コピーコンストラクタ</nowiki>になっています。<br /> <br /> == '''クラス コピーコンストラクタ''' == その名前のとおりの機能ですが、すんなり理解することはやや難しい仕組みです。コピーコンストラクタは、コピーするためのコンストラクタで引数部にクラス自身のconst参照型をうけとるものです。基本的にはクラスの宣言時の初期値を代入する処理をうまく動作させるために使われます。 '''CTest CTest2_obj = CTest1_obj;''' クラスの変数を代入演算子をつかって以下のように表現しようとしたとすると、 <syntaxhighlight lang="cpp"> CTest CTest1_obj; CTest CTest2_obj = CTest1_obj; </syntaxhighlight> という代入は、コピーコンストラクタという仕組みがない場合には、通常期待する代入とは違った動作になってしまいます。CTest2_objの値はCTest1_objと確かに同じ値を保持することになりますが、単純にCTest1_objと同じアドレスを保持することになるだけで、CTest1_objの保持している値と連動してしまいます。動的に生成されたクラス変数ならば、CTest1_objが消えれば、CTest2_objは実体の存在しないアドレスを保持していることになり、CTest2_objの保持するアドレス値をnull_ptrにするといったような細かい調整をしない限り、CTest2_objのデストラクタと呼ばれるクラス変数消滅時に必ず動作する処理で実体を消す処理がうまくいかずプログラムは異常終了します。 なんだかややこしい表現をして、おそろしい結末になるようなことを言いましたが、コピーコンストラクタをクラスに含めれば、そのような問題を解決できるということになります。 コピーコンストラクタは以下のように定義します。 CopyConstructor001.h <syntaxhighlight lang="cpp" line start="1"> #pragma once class CCopyConstructor001 { private: int xxx; public: //★コピーコンストラクタ CCopyConstructor001(const CCopyConstructor001& CconstrefCopyConstructor001_Para1); CCopyConstructor001(void); ~CCopyConstructor001(void); }; </syntaxhighlight> CopyConstructor001.cpp <syntaxhighlight lang="cpp" line start="1"> #include "stdafx.h" #include "CopyConstructor001.h" //★コピーコンストラクタ CCopyConstructor001::CCopyConstructor001(const CCopyConstructor001& CconstrefCopyConstructor001_Para1) { xxx = CconstrefCopyConstructor001_Para1.xxx; //★主に、メンバ変数の初期化処理を行う動作をさせる } CCopyConstructor001::CCopyConstructor001(void) { } CConstructor001::~CConstructor001(void) { } </syntaxhighlight> 参照型の引数によって、メインプログラム側で引数に設定されたクラスの各メンバ変数の値を取得できるため、コピーコンストラクタの中で、各メンバ変数の値を引数によって得られたクラスのメンバ変数とメンバ変数との間で、初期化の処理をする仕組みです。コピーコンストラクタの関数内では、この参照の仕組みをつかってコピーのための処理を記述できると考えてよいと思います。 他の言語を知る人にとっては、もっと単純にクラスの中身をコピーできる方法を作れば良いのに…と思う人も多いかもしれません。 実際にクラス変数のコピーに関するサンプルは、また後日に記述したいと思います。 ※無計画に、自分で考えながら書いてるとときどき間違っている表現をつかってしまったり、意外と自分自身、わかっていなかった部分に気付いたりしながらこの文書を作っています。できたてほやほやの記事は間違っている部分が結構ありそうです。わかりやすいとおもって読んでくれている人がいたとしたら期待を裏切りたくは無いですが、このC++関連の記事群はまだ未熟な部分もあり、理解への遠回りになってしまっていたら申し訳ないです。 [[C PlusPlus|C++]]に戻る
テンプレート:記事名の制約
(
ソースを閲覧
)
Cpp クラス コピーコンストラクタ
に戻る。
個人用ツール
3.21.44.134
このIPアドレスのトーク
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ