构造函数初始化对象 parent函数?

[更新]
·
·
分类:互联网
2528 阅读

构造函数初始化对象

parent函数?

parent函数?

程序写的多了,你会发现几乎所有的Qt类的构造函数都会有一个parent参数。这个参数通常是QObject* 或者是 QWidget* 类型的(定义新的类是通常首先初始化为0,在类的实现函数中赋值)。很多情况下它都会有一个初始值0,因此,即便你不去给它复制也没有丝毫的问题。于是,稍微偷懒一下,就会不自觉的忽略了这个参数。那么,这个参数 到底是干什么用的呢?
有了此参数,子类才会继承父类在构造函数中初始化了的数据,否则,父类的初始化数据的构造函数不执行,无法继承数据,如果吧数据定为私有的,又不便于类的通用继承。
其实,这个参数有很多用处。就像它的名字一样,这个参数指定了组件的父组件。对于一个对话框来说,对话框一般是不作为顶层容器出现的,因此在任 务栏上一般是没有对话框的位置的。怎么指定这个对话框不是顶层容器呢?有父组件的组件不就不是顶层容器了吗?因此,只要你指定对话框的parent属性, 任务栏就不会出现它的身影。当然,如果你不指定,这个对话框就成为顶层容器了,任务栏会给它留个位置的——利用这个特性,就可以实现特殊对话框可以在任务 栏出现的效果,比如“关于”对话框的出现。
另外比较通用,也是很重要的作用是,parent参数指明了组件的父组件,这样,当父组件delete时,Qt可以保证所有子组件——也就是 parent指针指向这个组件的所有组件——都会被正确的delete掉。这是Qt能够帮助我们管理一部分内存的原因所在。Qt是通过遍历parent属 性来防止了这一部分内存泄漏的。因此,必要情况下还是不要忘记设置这个parent属性。当然,如果你不声明这个属性,当整个程序关闭时,操作系统会回收 内存——因此我们所说的内存泄漏一般是指我们自己写的应用程序的内部,而不会影响到整个操作系统——当然,如果你实现太可恶,操作系统也会受不了自动关掉 你的程序的

如何初始化一个类中的静态成员变量?

如果不考虑父类的话,简单来说是先进行静态初始化,后进行非静态初始化。
静态初始化包括静态成员变量的初始化和静态块,实际上编译时都会集中到static块中。
而非静态初始化包括非静态成员变量初始化和非静态块以及构造方法,编译后都会集中到构造方法中。
如果没有相互调用那么很简单,先进行静态初始化,如果静态初始化过程中又调用后者呢?
可以写一个代码试验一下:
输出:
可以看到确实是先进行静态初始化,可是中间夹杂着对于构造方法的调用。
虽然编译器没有报错,但是这种调用其实是有风险的。
因为静态成员变量(假设有的话)并未初始化的过程中就调用类的构造函数,假设有依赖的情况下,实际上过程是不可控的。
看下面这个例子:
能想象到这种输出吗?
所以如果非要在静态初始化过程中,调用本类的构造函数。
一定要注意初始化顺序问题,精确到语句。