「コンストラクタとデストラクタ」の版間の差分
提供: C++入門
(同じ利用者による、間の1版が非表示) | |||
行1: | 行1: | ||
− | + | [[クラス]] は、[[コンストラクタ]]と[[デストラクタ]]と呼ばれるメンバを持ちます。 | |
− | + | ||
− | + | ||
__TOC__ | __TOC__ | ||
== 概要 == | == 概要 == | ||
− | |||
[[クラス]] は、[[コンストラクタ]]と[[デストラクタ]]と呼ばれるメンバを持ちます。 | [[クラス]] は、[[コンストラクタ]]と[[デストラクタ]]と呼ばれるメンバを持ちます。 | ||
[[クラス]]をインスタンス化するときに[[コンストラクタ]]が呼び出されます。 | [[クラス]]をインスタンス化するときに[[コンストラクタ]]が呼び出されます。 | ||
行16: | 行13: | ||
== クラスにおけるコンストラクタ == | == クラスにおけるコンストラクタ == | ||
− | |||
クラスの[[コンストラクタ]]は、クラス名と同じ名前を持ちます。 | クラスの[[コンストラクタ]]は、クラス名と同じ名前を持ちます。 | ||
行44: | 行40: | ||
== クラスにおけるデストラクタ == | == クラスにおけるデストラクタ == | ||
− | |||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
class C { | class C { | ||
行66: | 行61: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == | + | == コンストラクタとデストラクタの例 == |
+ | === ソースコード class_scope.cpp === | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <iostream> | ||
+ | using namespace std; | ||
+ | class Foo { | ||
+ | public: | ||
+ | Foo() { cout << __PRETTY_FUNCTION__ << endl;} | ||
+ | ~Foo() { cout << __PRETTY_FUNCTION__ << endl;} | ||
+ | void doit() { cout << __PRETTY_FUNCTION__ << endl;} | ||
+ | }; | ||
+ | |||
+ | int main(int argc, char const* argv[]) | ||
+ | { | ||
+ | |||
+ | Foo f; | ||
+ | f.doit(); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === コンパイル === | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | g++ class_scope.cpp -o class_scope | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === 実行例 === | ||
+ | メイン関数が呼び出されると Foo のインスタンスが作成されます。 | ||
+ | インスタンスが作成されたときに、[[コンストラクタ]]が呼び出されます。 | ||
+ | メイン関数のスコープが終わるときにFooのインスタンスの[[デストラクタ]]が呼び出されます。 | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | % ./class_scope | ||
+ | Foo::Foo() | ||
+ | void Foo::doit() | ||
+ | Foo::~Foo() | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == 関連項目 == | ||
+ | * [[継承と仮想デストラクタ]] | ||
* [[クラス]] | * [[クラス]] | ||
+ | <!-- vim: filetype=mediawiki | ||
+ | --> |
2014年7月27日 (日) 15:14時点における最新版
クラス は、コンストラクタとデストラクタと呼ばれるメンバを持ちます。
目次
概要
クラス は、コンストラクタとデストラクタと呼ばれるメンバを持ちます。 クラスをインスタンス化するときにコンストラクタが呼び出されます。 インスタンスが解放されたり、スコープ外になったときに、デストラクタが呼び出されます。
コンストラクタの役割は、インスタンスの初期化です。メンバ変数の初期化処理などを請け負います。
デストラクタの役割は、インスタンスの終了処理です。メモリの解放やファイルのクローズなどをやってもらうことができます。
クラスにおけるコンストラクタ
クラスのコンストラクタは、クラス名と同じ名前を持ちます。
class C { public: // コンストラクタ C() { } };
オーバーロードのために複数のコンストラクタを持つことができます。
class C { public: int m_i; // コンストラクタ C() { } C(int i): m_i(i) { } };
クラスのデストラクタは、クラス名の前にチルダ(~)をつけた名前を持ちます。
クラスにおけるデストラクタ
class C { public: // デストラクタ ~C() { } };
コンストラクタとデストラクタの省略
コンストラクタとデストラクタは、不要であれば、省略できます。
class C { public: void foo() { } };
コンストラクタとデストラクタの例
ソースコード class_scope.cpp
#include <iostream> using namespace std; class Foo { public: Foo() { cout << __PRETTY_FUNCTION__ << endl;} ~Foo() { cout << __PRETTY_FUNCTION__ << endl;} void doit() { cout << __PRETTY_FUNCTION__ << endl;} }; int main(int argc, char const* argv[]) { Foo f; f.doit(); return 0; }
コンパイル
g++ class_scope.cpp -o class_scope
実行例
メイン関数が呼び出されると Foo のインスタンスが作成されます。 インスタンスが作成されたときに、コンストラクタが呼び出されます。 メイン関数のスコープが終わるときにFooのインスタンスのデストラクタが呼び出されます。
% ./class_scope Foo::Foo() void Foo::doit() Foo::~Foo()