C++ Qt中的一个新手问题

C++ Qt中的一个新手问题,c++,qt,C++,Qt,在这段代码中,在之后:有什么作用 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } 平均值? < P>这实际上是一个C++问题。你所看到的被称为。QMainWindow(父)调用MainWindow的超类(QMainWindow)和ui(newui::MainWindow)的构造

在这段代码中,在
之后:
有什么作用

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

平均值?

< P>这实际上是一个C++问题。你所看到的被称为。
QMainWindow(父)
调用
MainWindow
的超类(
QMainWindow
)和
ui(newui::MainWindow)
的构造函数来构造
ui
成员。

这两行是所谓的初始化列表,并在该类的每个实例的“创建”时执行。继承另一个类的每个类都应该在此列表中包含对超类构造函数的调用

你也可以写:

QMainWindow(parent),
ui(new Ui::MainWindow)  
谁能找到更好的可读性。但是使用初始化列表稍微快一点,编译器正在对其进行优化。请注意,这些列表只能在构造函数中使用,并且不能调用对象的任何函数,因为它还没有“活动”。但您可以设置某些属性的值,并在以下语句中引用它们(例如,为了避免代码冗余),如以下示例中所示:

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

请注意,如果初始化列表中的成员顺序与类定义中的顺序不匹配,大多数编译器都会向您发出警告。

为了进一步解释,请注意,用户界面编译器生成的类也被称为(在本例中)
MainWindow
,但是它属于名称空间
Ui
,因此它的全名是
Ui::MainWindow
。这与继承自
QMainWindow
MainWindow
类明显不同。但是,
QMainWindow
-派生类有一个成员指针(称为
ui
)指向
ui::MainWindow
,该指针在构造函数中初始化,如上所述。查看uic生成的文件
ui\u mainwindow.h
,查看所有部分是如何组合在一起的。还要注意,
Ui::MainWindow
的成员都是公共的,因此在
MainWindow
中完全可以访问


另一种设计是使用多重继承合并两个
MainWindow
类的标识,从
QMainWindow
Ui::MainWindow
中派生您自己的
MainWindow
。但是,当前版本的QtCreator生成的代码遵循组合模式而不是继承模式。

那么这只用于构造函数?或者可以用于任何功能?。。但是在所有类型的构造函数中,包括复制构造函数。+1-这个答案很好地提醒我们Ui::MainWindow是MOC的产品,实际上并没有在MainWindow中声明。h-那里的声明看起来像。。。命名空间Ui{class MainWindow;}…实际上是一个存根类,用于加速编译。
#define DEFAULT_VALUE 1.0

class MyClass {

public:
    MyClass() :
        value1(DEFAULT_VALUE),
        value2(value1)
    {
    }

    MyClass(qreal value) :
        value1(value),
        value2(value1)
    {
    }

private:
    qreal value1;
    qreal value2;
};