「コンストラクタとデストラクタ」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> __TOC__ == 概要 == クラス は、コンストラクタデストラクタと呼ばれるメンバを持ちます...」)
 
行64: 行64:
 
}
 
}
 
};
 
};
 +
</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>
 
</syntaxhighlight>
  

2013年3月23日 (土) 22:09時点における版


概要

クラス は、コンストラクタデストラクタと呼ばれるメンバを持ちます。 クラスをインスタンス化するときにコンストラクタが呼び出されます。 インスタンスが解放されたり、スコープ外になったときに、デストラクタが呼び出されます。

コンストラクタの役割は、インスタンスの初期化です。メンバ変数の初期化処理などを請け負います。

デストラクタの役割は、インスタンスの終了処理です。メモリの解放やファイルのクローズなどをやってもらうことができます。

クラスにおけるコンストラクタ

クラスのコンストラクタは、クラス名と同じ名前を持ちます。

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()

関連項目