コンストラクタ
提供: C++入門
2014年7月27日 (日) 15:51時点におけるDaemon (トーク | 投稿記録)による版 (ページの作成:「コンストラクタ(constructor, 構築子) とは、C++のクラスのインスタンスが作成されるときに、オブジェクトの初期化を...」)
スポンサーリンク
コンストラクタ(constructor, 構築子) とは、C++のクラスのインスタンスが作成されるときに、オブジェクトの初期化をするために自動的に呼び出されるメンバ関数です。C++のクラスのコンストラクタの命名規則は、クラス名と同名、と決まっています。
読み方
- コンストラクタ
- こんすとらくた
- constructor
- こんすとらくた
- 構築子
- こうちくし
概要
クラスは、オブジェクトが作成されるときに呼び出されるコンストラクタとデストラクタを持ちます。コンストラクタは、オブジェクトの初期化を担当します。デストラクタは、オブジェクトの後始末を担当します。ファイルのクローズ、メモリの開放などのリソースの開放などを担当させることができます。デストラクタでリソースの開放処理を行うことで、開放漏れを防ぐことができます。
コンストラクタの定義
C++のデストラクタは、クラス名をつけると命名規則が決まっています。
class X { X () {} ~X () { cout << __PRETTY_FUNCTION__ << endl; } };
C++のコンストラクタにおける例外
C++のコンストラクタでは、例外を投げてはいけない、と言われています。この迷信めいた話は、メモリリークを懸念してのことです。 投げても良いのですが、投げる時には、注意が必要です。
リソースの開放をデストラクタで実施している場合、デストラクタが呼び出されないため、コンストラクタでファイルを開いて、デストラクタでclose(閉じる)しようと思っていた場合、close ができなくなります。この処理をclose用のメンバ変数のクラスに任せておけば、問題ないのでしょう。
/* * constructor_throw.cpp * Copyright (C) 2014 kaoru <kaoru@bsd> */ #include <iostream> #include <exception> using namespace std; class A { int i_; public: A (int i): i_(i) { cout << __PRETTY_FUNCTION__ << ":" << i_ << endl; } ~A () { cout << __PRETTY_FUNCTION__ << ":" << i_ << endl; } }; class ConstThrow { A a; A *ptr; public: ConstThrow () :a(0){ cout << __PRETTY_FUNCTION__ << endl; ptr = new A(1); throw exception(); } ~ConstThrow () { cout << __PRETTY_FUNCTION__ << endl; } }; int main(int argc, char const* argv[]) { ConstThrow *p = NULL; try { p = new ConstThrow(); } catch (exception &e) { } cout << std::hex << p << endl; delete p; return 0; }
newの時点でthrowしているので、pはNULL(0)のままです。
$ ./a.out A::A(int):0 ConstThrow::ConstThrow() A::A(int):1 A::~A():0 0x7fffffffd7b8 ConstThrow::~ConstThrow() A::~A():0 0x0
関連項目
- クラス
- コンストラクタとデストラクタ
- コンストラクタ
- デストラクタ
- 基底クラス
- 継承と仮想デストラクタ
- 仮想関数
- newとdelete
- STL(Standard Template Library)
- コンテナ
ツイート
スポンサーリンク