参考链接

  1. QT中用父类构造函数初始化子类的成员变量
  2. Qt ------ 初始化构造函数参数,parent
  3. C++ 构造函数和析构函数是否可以继承?

描述

在Qt新建继承Qt类的类后,经常会在构造函数看到parent的参数的初始化。如:
DialogRangeReference.h

class DialogRangeReference : public QDialog
{Q_OBJECTpublic:explicit DialogRangeReference(QWidget *parent = 0);……
private:Ui::DialogRangeReference *ui;
}

DialogRangerReference.cpp

DialogRangeReference::DialogRangeReference(QWidget *parent) :QDialog(parent),ui(new Ui::DialogRangeReference)
{……
}

解析

以上面的代码为例,可以发现DialogRangeReferenceQDialog的子类。uiDialogRangeReference的成员。ui(new Ui::DialogRangeReference)是初始化ui,这里new出一个对象赋值给ui

而在构造函数定义中QDialog(parent)会比较晦涩。这里需要结合继承于QDialog来说,QDialogDialogRangeReference的父类,并且DialogRangerReference的构造函数带参数QWidget *parent,因此这里的其实是调用了父类的构造函数,并将参数parent传给了父类的构造函数。在执行DialogRangeReference的构造函数前,先调用父类QDialog的构造函数。由于这里是调用,而不是赋初值,因此这里的写法与ui是有区别的。

扩展

  1. 构造函数的参数为QWidget是因为QWidget为窗口类的基类;QObject则是非窗口类的基类;
  2. 指定parent可以指定此类的父类,当父类delete时,Qt可以保证所有子类都会被正确的delete掉,能够帮助开发人员管理一部分内存;
  3. 指定了parent则指定了组件的父组件。这对于一个对话框来说是比较合适的,因为对话框一般不作为顶层容器出现。因此任务栏上不会有对话框的位置。如果对话框不指定parent,则对话框会作为顶层容器出现。

补充示例

父类Student.h如下:

#include<iostream>
#include<string>using namespace std;class Student
{
public:Student(int n,string nam,char s) {num=n;name=nam;sex=s;}~Student(){}protected:int num;string name;char sex;
};

子类Student1.h如下:

class Student1:public Student
{Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s) {age=a;addr=ad;}void show(){}private:int age;string addr;
};

main.cpp如下:

int main()
{Student1 stud1(10010,"Wang",'f',19,"BeiJing Road,Shanghai");......
}

解析

派生子类会继承基类的所有成员,除了构造函数和析构函数(派生子类会调用父类的无参数构造函数,是调用,而不是继承)。因此,子类从父类继承过来的成员变量,若不想自己写构造函数初始化时,就只能先初始化父类中的成员变量,然后再继承过来。

从上面代码中可以看出,子类Student1中的构造方法只有对新增成员int age和string addr的初始化操作,对于从父类继承过来的成员num,name,sex无初始化语句,但子类又不能继承父类的构造方法,要么就另外再写一个初始化语句,可这样操作就造成了重复性语句。此时就得通过Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s){age=a;addr=ad;}先初始化父类成员变量,从而间接初始化子类从父类继承过来的成员变量。


请注意派生子类构造函数首行的写法:

Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s)

其一般形式为:

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

冒号前面的部分是派生类构造函数的主干,它的总参数表列中包括基类构造函数所需的参数和对派生类新增的数据成员初始化所需的参数。冒号后面的部分是要调用的基类构造函数及其参数。

基类构造函数后面括号内的参数表列中只有参数但无参数类型,因为在这里不是定义基类构造函数,而是调用基类构造函数,因此这些参数是实参而不是形参。他们可以是常量、全局变量和派生类构造函数总参数表中的参数。


从上面代码可以看到,在main函数中,建立对象stud1时,有5个参数,其中前3个是用来传递基类构造函数的,后2个用来对派生子类所增加的数据成员初始化。

以上例子中,调用基类构造函数时的实参是从子类构造函数的总参数表中获得的,也可以不从那传递,直接使用常量或全局变量,如:Student1(string nam,char s,int a,string ad):Student(10010,nam,s);这样父类的n默认初始化为10010,子类直接把n=10010继承过来,因此不用写。

Qt构造函数的初始化问题相关推荐

  1. 构造函数的初始化列表

    首先,运行下图中的C++代码,输出是什么? class A { private:int n1;int n2; public:A(): n2(0) , n1(n2 + 2){}void Print(){ ...

  2. c++中类的构造函数的初始化成员列表详解

    昨天傍晚在阅读OpenCV的程序时看到代码如下: inline Mat::Mat() : size(&rows) {     initEmpty(); } 第一行中单冒号及其后边的内容我完全不 ...

  3. c++构造函数成员初始化中赋值和初始化列表两种方式的区别

    先总结下: 由于类成员初始化总在构造函数执行之前 1)从必要性: a. 成员是类或结构,且构造函数带参数:成员初始化时无法调用缺省(无参)构造函数 b. 成员是常量或引用:成员无法赋值,只能被初始化 ...

  4. 不存在从node到node*的适当转换函数_C++构造函数和初始化表

    构造函数和初始化表 1 构造函数 当类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,因此构造函数的作用是初始化对象的数据成员. 2 构造函数可以重载 构 ...

  5. C++远航之封装篇——默认构造函数、初始化列表、拷贝构造函数

    1.默认构造函数 没有参数: 若有参数,则一定全部都有默认的参数值. 2.初始化列表 (1)概念 (2)特性 建议用初始化列表来初始化数据成员. 初始化列表先于构造函数执行: 初始化列表只能用于构造函 ...

  6. c++ loadlibrary 初始化对象_C++构造函数和初始化表

    构造函数和初始化表 1 构造函数 当类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,因此构造函数的作用是初始化对象的数据成员. 2 构造函数可以重载 构 ...

  7. 第十四章 构造函数和初始化表

    十四.构造函数和初始化表 1.构造函数和普通函数类似,也可以重载或带有缺省参数: 05constructor.cpp class Student{public:Student(const string ...

  8. C++之构造函数的初始化参数表

    对于常量类型(const int a)和引用类型(int& a)的数据成员,不能在构造函数中用赋值语句直接赋值,C++提供初始化表进行置初值. 带有成员初始化表的构造函数的一般形式如下: 类名 ...

  9. C++构造函数之初始化列表

    C++构造函数之初始化列表 构造函数可以说是对于C++每个类来说最重要的组成部分,之前也详细介绍过构造函数的相关知识,今天给构造函数进行补充,主要说明一下构造函数的初始值列表 一.初始化列表的写法 仍 ...

最新文章

  1. R语言常用函数总结大全
  2. Rushcrm:客户关系管理适合的才是好的
  3. mysql 查询结果行变列_SQL 查询怎么将行变成列
  4. codeforces570C
  5. [AI开发]目标跟踪之行为分析
  6. Spring + JDBC + Struts联合开发(实现单表的CRUD)
  7. Spring AOP的一个具体例子
  8. 基于深度学习模型的花卉图像分类代码_华为不止有鸿蒙!教你快速入门华为免编程深度学习神器ModelArts...
  9. Java | 用Java实现选择排序算法(记录写程序全过程的编程哲学)
  10. 豆瓣镜像源的使用与pip包版本控制
  11. c语言回调函数构架程序,C语言回调函数熟练---使用方法(构建程序框架方便好用)...
  12. android gradle fail,Android Studio更新后,Android Gradle CompilationFailedException
  13. Rust 能取代 Python,更好的实现神经网络?
  14. DuiLib(一)——窗口及消息
  15. 八点建议助您写出优雅的Java代码
  16. java垃圾回收文档整理
  17. 关于慧斯顿电桥的疑惑
  18. 【webRTC】一个基于 tornado 和 webRTC 的点对点视频语音文字聊天室
  19. 如何策划管理PPC活动(百度推广/直通车/谷歌推广)
  20. Java开源项目管理工具大全

热门文章

  1. 炫“酷”行动-人大金仓有奖征文--金仓分析型数据库迁移IBM Netezza一体机技术可行性
  2. 用R语言写一颗圣诞树
  3. 腾讯云AMD云服务器使用体验?
  4. python 基金净值_Python爬虫周记之案例篇——基金净值Selenium动态爬虫
  5. High Gain_High Frequency-非线性控制
  6. python 爬虫(一) requests+BeautifulSoup 爬取简单网页图片代码示例
  7. 理财小白日记(1)-无脑回忆录
  8. c语言一个图片是幼儿园的,【资源学习】c语言程序代码,登录幼儿园200个小朋友的数据...
  9. 微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记4)支持React.js语法的Taro框架
  10. python构建矩阵_python矩阵运算 | 学步园