C++中类的成员初始化问题

子类进行构造函数之前,必须先运行父类构造函数。
子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法

  • 父类 没有写出构造函数或者有一个无参数的构造函数,子类构造函数可以不用对父类初始化,即忽略父类的构造函数,
  • 父类的构造函数全是有参数的,子类必须至少实现一个父类的构造函数,例如Qt中常见的:
explicit MainWindow(QWidget* parent=0);

MainWindow::Mainwindow(QWidget* parent):
    QMainWindow(parent),
    ui(new Ui::MainWindow)

这种方式解决的问题是:使用A类创建一个对象后,怎样初始化它从类B中继承过来的数据成员?(父类的构造函数是不能被继承的)

这种代码的具体格式:

派生类::派生类构造函数(总参数列表):基类构造函数(参数列表)
{
    派生类中的数据成员初始化;
}

注意:如果没有基类和派生的关系,就不能用这种初始化格式,否则报错。

第二种情况:对类中的const成员进行初始化必须用这种方式。

class Father {
public:
    explicit Father(int father):
            f(father)
    {

    }
private:
    const int f;
};

第三种情况:两个类之间没有继承关系,但是一个类包含另一个类类型的成员变量,而后者的构造函数都是有参数的。

举例:Father类跟上面一样,增加类Son如下:

class Son
{
public:
    explicit Son()
            :father(s)
    {

    }
private:
    Father father;
    int s;
};

Son构造函数前,先运行Father的构造函数,所以需要对其初始化,否则报错。
如果Father类有一个函数是无参数的,那就不需要在Son类中对father显式初始化,让编译器自动完成即可。
如果嫌初始化太麻烦,就可以把father改成指针类型,这也是Qt中的常见方法,然后可以到Son的构造函数中对指针进行初始化,也可以仍然用成员初始化列表的方法:

class Son
{
public:
    explicit Son()
            :father(new Father(s))
    {

    }
private:
    Father father;
    int s;
};

类似的,Qt中的ui变量初始化可以放到构造函数里:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    ui = new Ui::MainWindow;
    ui->setupUi(this);
}

猜你喜欢

转载自blog.csdn.net/yao5hed/article/details/81050477