构造方法用来初始化类的对象,与父类的其它成员不同,它不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法)。因此,在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。
如果没有显式的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显式地声明构造函数情况下创建。
构造原则如下:
- #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;
- };
当然,类中普通的成员变量也可以采取此种方式进行初始化,然而,这就没有必要了..