在mianWindow.cpp中第一行代码如下。
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
/***/
}
这是C++继承,说明 MainWindow 的构造函数之前需要调用父类 QMainWindow 的带有参数的构造函数。
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
}
MianWindow是一个类,“::”(作用域区分符)后面跟着的是一个构造函数。但是这个构造函数之后的“:”后面的QMainWindow(parent)该怎样去理解呢?
在C++中,当创建一个对象时,编译器要保证调用了所有子对象的构造函数,这是C++强制要求的,也是它的一个机制。
现在有一个派生类A,它继承基类B。现在问题是:使用A类创建一个对象后,怎样初始化它从类B中继承过来的数据成员?(子类是无法继承父类的构造函数和析构函数的)。总结下:因为初始化列表中无法直接初始化基类的数据成员,所以你需要在列表中指定基类的构造函数,如果不指定,编译器则会调用基类的默认构造函数。
代码中QMainWindow(parent)是基类构造函数
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent)
构造函数后面括号内的参数表列中只有参数但无参数类型,因为在这里不是定义基类构造函数,而是调用基类构造函数,因此这些参数是实参而不是形参。他们可以是常量、全局变量和派生类构造函数总参数表中的参数。 先初始化父类成员变量,从而间接初始化子类从父类继承过来的成员变量。
这个问题就是使用上面的那行代码来解决的。首先QMainWindow是父类(基类)而MainWindow是子类(派生类),他们是继承关系;MainWindow(QWidget *parent)是类MainWindow的构造函数,QMainwindow(parent)是类QMainwindow的构造函数。类Mainwindow在实现构造函数时,要初始化基类QMainwindow的数据成员但是因为无法继承基类的构造函数,所以才用这种方式初始化基类的数据成员。
说一下,这种代码的具体格式
派生类::派生类构造函数(总参数列表):基类构造函数(参数列表) //基类构造函数的参数列表是实参。
{
派生类中的数据成员初始化;
}
==> add:
至于ui(new Ui::MainWindow),就是一个成员变量,通过初始化列表进行初始化
当然,也可以不用初始化列表的方式对ui定义,而是在函数内部进行
//对父类进行初始化
//调用格式为“子类构造函数 : 父类构造函数”,
//如下,其中QMainWindow是MainWindow的父类:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
// ui(new Ui::MainWindow)//对类成员进行初始化
{
ui = new Ui::MainWindow;
ui->setupUi(this);
***
}