Эти две строки представляют собой так называемый список инициализации и выполняются во время «создания» каждого экземпляра этого класса. Каждый класс, наследующий другой, должен содержать вызов конструктора суперкласса в этом списке.
Вы также можете написать:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
ui = new Ui::MainWindow();
ui->setupUi(this);
}
, который можно было бы найти лучше читаемым. Но использование списка инициализации немного быстрее и оптимизируется компилятором. Обратите внимание, что эти списки могут использоваться только в конструкторах, и вы не можете вызывать какие-либо функции объекта - потому что он еще не «живет». Но вы можете установить значение некоторых атрибутов и ссылаться на них в следующих инструкциях (например, чтобы избежать избыточности кода), как в следующем примере:
#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;
};
Обратите внимание, что большинство компиляторов предупреждают вас, если порядок членов в вашем списке инициализации не соответствует порядку в определении класса.