MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)解析

1、https://blog.csdn.net/weixin_41157654/article/details/80820520

最近跟着前辈们打打下手,顺便研究研究代码,以前没怎么用过QT和C++语言,这次跟着前辈好好学习。在研究代码时看到这样的形式,很怪异,就在网上找了一下,发现有个解释的就转载了过来,学习学习,没想到是初始化。

在mianWindow.cpp中第一行代码如下。

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent)
{
}

    这是C++继承,说明 MainWindow 的构造函数之前需要调用父类 QMainWindow 的带有参数的构造函数。

    MianWindow是一个类,“::”(作用域区分符)后面跟着的是一个构造函数。但是这个构造函数之后的“:”后面的QMainWindow(parent)该怎样去理解呢?

    在C++中,A与B之间是继承关系,A与B之间可以用“:”连接,但是类是没有参数的。因此QMainWindow(parent)是不能理解为类的。

    如果不是类,那么最有可能的就是构造函数。现在假设QMainWindow(parent)为某类的构造函数,那么这个构造函数在这句代码中起到了什么作用呢?该怎么去理解这句代码?这个问题是我第一次碰到这句代码时在脑袋中产生的疑问(这属于C++的知识)。

    C++中,通过继承可以使类形成一种层次关系。在层次关系的根部的称之为基类,它负责定义在层次关系中所有类共同的成员;直接或者间接的从基类继承而来的称作派生类,它负责定义各自的特有成员。

    在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的数据成员但是因为无法继承基类的构造函数,所以才用这种方式初始化基类的数据成员。

说一下,这种代码的具体格式

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

2、https://bbs.csdn.net/topics/380091458

Dialog::Dialog(QWidget *parent):QDialog(parent)中的QDialog(parent)是什么意思?

parent参数指定了Dialog的父窗口部件,如果是0,意味着该Dialog没有父对象。

posted @ 2019-05-09 16:37  kuaqi  阅读(4002)  评论(0编辑  收藏  举报