Die Konstruktormethode wird verwendet, um Klassenobjekte zu initialisieren. Anders als andere Member der Elternklasse kann sie nicht von der Unterklasse geerbt werden (eine Unterklasse kann alle Membervariablen und Membermethoden der Elternklasse erben, aber nicht die Konstruktormethoden der Elternklasse). Wenn daher ein Unterklassenobjekt erstellt wird, muss das System, um die von der Elternklasse geerbten Datenmember zu initialisieren, die Konstruktormethoden der Elternklasse aufrufen.

Wenn es keinen expliziten Konstruktor gibt, stellt der Compiler einen Standardkonstruktor bereit, und dieser Standardkonstruktor wird nur erstellt, wenn kein Konstruktor explizit deklariert ist.

Die Konstruktionsprinzipien sind wie folgt:

  • 1. Wenn die Unterklasse keine Konstruktormethode definiert, wird die parameterlose Konstruktormethode der Elternklasse aufgerufen.
  • 2. Wenn die Unterklasse eine Konstruktormethode definiert, egal ob ohne Argumente oder mit Argumenten, wird beim Erstellen eines Objekts der Unterklasse zuerst die parameterlose Konstruktormethode der Elternklasse ausgeführt und danach ihre eigene Konstruktormethode.
  • 3. Beim Erstellen eines Unterklassenobjekts wird, wenn der Konstruktor der Unterklasse nicht explizit den Konstruktor der Elternklasse aufruft, der standardmäßige parameterlose Konstruktor der Elternklasse aufgerufen.
  • 4. Beim Erstellen eines Unterklassenobjekts wird, wenn der Konstruktor der Unterklasse nicht explizit den Konstruktor der Elternklasse aufruft und die Elternklasse selbst einen parameterlosen Konstruktor bereitstellt, der eigene parameterlose Konstruktor der Elternklasse aufgerufen.
  • 5. Wenn beim Erstellen eines Unterklassenobjekts der Konstruktor der Unterklasse nicht explizit den Konstruktor der Elternklasse aufruft und die Elternklasse nur ihren eigenen parametrisierten Konstruktor definiert, tritt ein Fehler auf (wenn die Elternklasse nur einen parametrisierten Konstruktor hat, muss die Unterklasse diese parametrisierte Konstruktormethode explizit aufrufen).
  • 6. Wenn die Unterklasse den parametrisierten Konstruktor der Elternklasse aufruft, muss sie dies durch Initialisieren des Member-Objekts der Elternklasse tun, zum Beispiel:

Beispiel

#pragma once class CDrugDlg : public CDialogEx { DECLARE_DYNAMIC(CDrugDlg) public: CDrugDlg(CWnd* pParent = NULL); // Standardkonstruktor virtual ~CDrugDlg(); // Dialogdaten enum { IDD = IDD_DRUG_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung 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(); };

Nach dem Konstruktor der Fisch-Klasse einen Doppelpunkt hinzufügen:, dann den parametrisierten Konstruktor der Elternklasse hinzufügen. Auf diese Weise ruft das System, wenn der Konstruktor der Unterklasse aufgerufen wird, den parametrisierten Konstruktor der Elternklasse auf, um das Objekt zu konstruieren.

Ausnahmen wie die übliche MFC-CDialog-Vererbung sind in solchen Beispielen zu sehen..

Beispiel

#pragma once class CDrugDlg : public CDialogEx { DECLARE_DYNAMIC(CDrugDlg) public: CDrugDlg(CWnd* pParent = NULL); // Standardkonstruktor virtual ~CDrugDlg(); // Dialogdaten enum { IDD = IDD_DRUG_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung 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(); };

Implementierungsdatei

Beispiel

// DrugDlg.cpp : Implementierungsdatei // #include "stdafx.h" #include "Medical.h" #include "DrugDlg.h" #include "afxdialogex.h" // CDrugDlg Dialog IMPLEMENT_DYNAMIC(CDrugDlg, CDialog) CDrugDlg::CDrugDlg(CWnd* pParent /*=NULL*/) :CDialogEx(CDrugDlg::IDD, pParent) { } CDrugDlg::~CDrugDlg() { }

Diese Initialisierungsmethode wird auch häufig verwendet, um konstante (const) Mitglieder einer Klasse zu initialisieren, wie im folgenden Code gezeigt:

Beispiel

class point {   public:      point():x(0),y(0)   private:      const int x;      const int y; };

Natürlich können auch gewöhnliche Membervariablen in einer Klasse auf diese Weise initialisiert werden, aber das ist nicht notwendig..

Quelle: http://blog.jobbole.com/109500/