コンストラクタはクラスのオブジェクトを初期化するために使用されます。親クラスの他のメンバーとは異なり、サブクラスに継承されません(サブクラスは親クラスのすべてのメンバー変数とメンバーメソッドを継承できますが、親クラスのコンストラクタは継承されません)。したがって、サブクラスのオブジェクトを作成するとき、親クラスから継承したデータメンバーを初期化するために、システムはその親クラスのコンストラクタを呼び出す必要があります。
明示的なコンストラクタがない場合、コンパイラはデフォルトのコンストラクタを提供します。そして、そのデフォルトのコンストラクタは、コンストラクタが明示的に宣言されていない場合にのみ作成されます。
コンストラクタの原則は次のとおりです:
- 1. サブクラスがコンストラクタを定義していない場合、親クラスの引数なしのコンストラクタが呼び出されます。
- 2. サブクラスがコンストラクタを定義している場合、引数なしでも引数付きでも、サブクラスのオブジェクトを作成するとき、最初に親クラスの引数なしのコンストラクタが実行され、次に自分のコンストラクタが実行されます。
- 3. サブクラスのオブジェクトを作成するとき、サブクラスのコンストラクタが親クラスのコンストラクタを明示的に呼び出さない場合、親クラスのデフォルトの引数なしコンストラクタが呼び出されます。
- 4. サブクラスのオブジェクトを作成するとき、サブクラスのコンストラクタが親クラスのコンストラクタを明示的に呼び出さず、かつ親クラス自身が引数なしコンストラクタを提供している場合、親クラス自身の引数なしコンストラクタが呼び出されます。
- 5. サブクラスのオブジェクトを作成するとき、サブクラスのコンストラクタが親クラスのコンストラクタを明示的に呼び出さず、かつ親クラスが自分の引数付きコンストラクタしか定義していない場合、エラーになります(親クラスに引数付きコンストラクタしかない場合、サブクラスはこの引数付きコンストラクタを明示的に呼び出す必要があります)。
- 6. サブクラスが親クラスの引数付きコンストラクタを呼び出す場合、親クラスのメンバーオブジェクトを初期化する方法を使用する必要があります。例:
例
#pragma once
class CDrugDlg : public CDialogEx
{
DECLARE_DYNAMIC(CDrugDlg)
public:
CDrugDlg(CWnd* pParent = NULL); // 標準コンストラクタ
virtual ~CDrugDlg();
// ダイアログデータ
enum { IDD = IDD_DRUG_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg void OnDestroy();
};
fish クラスのコンストラクタの後に、コロンを追加します。:次に、親クラスの引数付きコンストラクタを追加します。こうすることで、サブクラスのコンストラクタが呼び出されると、システムは親クラスの引数付きコンストラクタを呼び出してオブジェクトを構築します。
例えば、MFC でよく見られる CDialog の継承では、このような例を見ることができます..
例
#pragma once
class CDrugDlg : public CDialogEx
{
DECLARE_DYNAMIC(CDrugDlg)
public:
CDrugDlg(CWnd* pParent = NULL); // 標準コンストラクタ
virtual ~CDrugDlg();
// ダイアログデータ
enum { IDD = IDD_DRUG_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg void OnDestroy();
};
実装ファイル
例
// DrugDlg.cpp : 実装ファイル
//
#include "stdafx.h"
#include "Medical.h"
#include "DrugDlg.h"
#include "afxdialogex.h"
// CDrugDlg ダイアログ
IMPLEMENT_DYNAMIC(CDrugDlg, CDialog)
CDrugDlg::CDrugDlg(CWnd* pParent /*=NULL*/)
:CDialogEx(CDrugDlg::IDD, pParent)
{
}
CDrugDlg::~CDrugDlg()
{
}
この初期化方法は、クラス内の定数(const)メンバーを初期化するためにもよく使用されます。次のコードのようになります:
例
class point
{
public:
point():x(0),y(0)
private:
const int x;
const int y;
};
もちろん、クラス内の通常のメンバー変数もこの方法で初期化できますが、それは必要ありません..
出典:http://blog.jobbole.com/109500/