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 /> | ||
== '''クラス コンストラクタ''' == | == '''クラス コンストラクタ''' == | ||
+ | コンストラクタとは、クラスが実体化されたとき、クラス変数が作られたときに自動的に呼び出される関数です。変数生成時に初期化引数を与えられた場合には、自動的に呼び出される関数が引数の形式と一致するものが呼び出されます。 | ||
+ | |||
+ | |||
+ | クラスが作られるときに自動的に呼び出される関数?それってなんていう名前の関数なのか?とか気になると思いますが、クラス名と同じ名前の関数が呼び出されることになっています。例えば、CTestというクラスならCTest()というメンバ関数になります。基本的にはpublicのアクセス指定子を付与するのが通常です。今までのサンプルでもしれっとコンストラクタは登場していました。コンストラクタは英語でConstructorと表記されるもので、直訳としては建設者みたいな感じで擬人化された表現です。インスタラクタが教えてくれる人であるように、イントラクションしてくれる人。指示してくれる人。という表現に似ています。Construction(建設)してくれる人がConstructorです。 | ||
+ | |||
+ | |||
+ | 自動的に呼び出される関数ですが、呼び出さないようにする方法はあるのでしょうか?それはプログラムとして何も記述しなければいいだけのことです。実際には、呼び出されているのかもしれませんが、何もしないことに変わりないので、それでよしとするしかありません。ん~でも、コンストラクタ中で自分自身のクラスを呼び出したりすると再帰的に呼び出されたりして、ややこしいことになりそうです。いや、なります。最悪は無限にループします。危険です。自動で呼び出されるというのは、実に危険なことです。やっていいことと悪いことが発生します。そこは肝に銘じておかなければならないでしょう。 | ||
+ | |||
+ | |||
+ | では、基本的な記述方法を見ておきましょう。例えばCConstructor001というクラスを作る場合 | ||
+ | Constructor001.h | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #pragma once | ||
+ | class CConstructor001 | ||
+ | { | ||
+ | public: | ||
+ | CConstructor001(void);//★1.コンストラクタ 引数無し | ||
+ | }; | ||
+ | </syntaxhighlight> | ||
+ | ★1.部分のようにクラス名と同じ名前のメンバ関数を呼び出す感じで定義することができて、プログラムとして以下のように | ||
+ | |||
+ | Constructor001.cpp | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include "Constructor001.h" | ||
+ | CConstructor001::CConstructor001(void) | ||
+ | { | ||
+ | printf("■CConstructor001コンストラクタ\n");//★2. | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | のように、プログラムを記述することができます。上記のように定義することによって、メインプログラムとかから、クラスが生成されたり、作成されるとコンストラクタの関数の中のプログラムが処理され、上記の例であれば★2.部分のプログラムが実行されます。上記では引数をもたないコンストラクタを作ったので引数部には(void)と記述されています。そうするとメインプログラムでは、 | ||
+ | |||
+ | |||
+ | Sample_main.cpp | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include "stdafx.h" | ||
+ | #include "Constructor001.h" | ||
+ | |||
+ | int _tmain(int argc, _TCHAR* argv[]) | ||
+ | { | ||
+ | CConstructor001 CConstructor001_instance; | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | という具合に、引数を持たない初期化方法によってクラスを作成するとコンストラクタが自動的に呼び出され、これだけの実行であってもコンストラクタが動作し、出力結果として | ||
+ | |||
+ | |||
+ | 出力結果 | ||
+ | <syntaxhighlight lang="text"> | ||
+ | ■CConstructor001コンストラクタ | ||
+ | </syntaxhighlight> | ||
+ | のような実行結果が得られます。ここまでがコンストラクタの基本です。 | ||
+ | |||
+ | |||
+ | 少し、ややこしいところに踏み込みますが、コンストラクタには引数を与えることができます。例えば、int型変数を動的に生成する場合は | ||
+ | |||
+ | |||
+ | int* nValue = new int(1000); | ||
+ | |||
+ | あるいは | ||
+ | |||
+ | int nValue = 1000; | ||
+ | |||
+ | あるいは | ||
+ | |||
+ | int nValue(1000); | ||
+ | |||
+ | とすると初期値を1000としてnValueというint型の変数が作成できます。これと同じようなしくみとして、コンストラクタを利用するならば、引数をとることができるコンストラクタを作成できます。そのためにプログラムを以下のように変更します。 | ||
+ | |||
+ | Constructor001.h | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #pragma once | ||
+ | class CConstructor001 | ||
+ | { | ||
+ | public: | ||
+ | CConstructor001(void); | ||
+ | CConstructor001(int nValue_Para01)//★11.コンストラクタ 引数有り int型変数1つ | ||
+ | }; | ||
+ | </syntaxhighlight> | ||
+ | という具合に引数をとる★11.のようなコンストラクタを作ることができます。もちろんプログラム部でも、その引数を利用することができて | ||
+ | |||
+ | Constructor001.cpp | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include "Constructor001.h" | ||
+ | CConstructor001::CConstructor001(void) | ||
+ | { | ||
+ | printf("■CConstructor001コンストラクタ\n"); | ||
+ | } | ||
+ | |||
+ | CConstructor001::CConstructor001(int nValue_Para01) | ||
+ | { | ||
+ | printf("■CConstructor001コンストラクタ=%d\n",nValue_Para01);//★12. | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | のように引数付きのコンストラクタを追加できます。同じ関数名であっても引数が違えば、いくつでも同じ関数を作って問題ありません。様々な引数の形式に対応しようとすれば、コンストラクタは複雑さを増してきます。通常はテンプレート関数やテンプレートクラスという手法を使って、様々な引数をとることができるようなプログラムを作成しますが、そのことについてはテンプレートの項目で解説したいと思います。 | ||
+ | |||
+ | |||
+ | int型のようにクラスの実体そのものがなんらかの値を返すことができるような工夫がなければint型と同じようなコンストラクタは作れません。そのことについては後で記述したいと思います。 |