Cpp クラス コピーコンストラクタ 新しいページはコチラ
提供: yonewiki
(ページの作成:「<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-tex...」) |
(→クラス コピーコンストラクタ) |
||
8行: | 8行: | ||
<br /> | <br /> | ||
== '''クラス コピーコンストラクタ''' == | == '''クラス コピーコンストラクタ''' == | ||
+ | その名前のとおりの機能ですが、すんなり理解することはやや難しい仕組みです。コピーコンストラクタは、コピーするためのコンストラクタで引数部にクラス自身のconst参照型をうけとるものです。 | ||
+ | |||
+ | |||
+ | クラスの変数を代入演算子をつかって以下のように表現しようとしたとすると、 | ||
+ | |||
+ | <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のデストラクタと呼ばれるクラス変数消滅時に必ず動作する処理で実体を消す処理がうまくいかずプログラムは異常終了します。 | ||
+ | |||
+ | |||
+ | なんだかややこしい表現をして、おそろしい結末になるようなことを言いましたが、コピーコンストラクタをクラスに含めれば、そのような問題を解決できるということになります。 | ||
+ | |||
+ | |||
+ | コピーコンストラクタは以下のように定義します。 | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #pragma once | ||
+ | class CCopyConstructor001 | ||
+ | { | ||
+ | private: | ||
+ | int xxx; | ||
+ | public: | ||
+ | //★コピーコンストラクタ | ||
+ | CCopyConstructor001(const CCopyConstructor001& CconstrefCopyConstructor001_Para1); | ||
+ | CCopyConstructor001(void); | ||
+ | |||
+ | ~CCopyConstructor001(void); | ||
+ | }; | ||
+ | </syntaxhighlight> | ||
+ | <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> |