「コンストラクタ」の版間の差分
提供: C++入門
(相違点なし)
|
2014年7月27日 (日) 15:51時点における最新版
コンストラクタ(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