c++中成员变量初始化列表的使用

.h文件内容如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>



QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

private slots:
    void onButtonClicked();

private:
    QPushButton *button;
    QLabel *label;


};
#endif // MAINWINDOW_H

.cpp 文件内容如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow),
    button(new QPushButton("Click Me", this)),
    label(new QLabel("Hello, World!", this))
{
    ui->setupUi(this);


    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(button);
    layout->addWidget(label);

    QWidget *centralWidget = new QWidget(this);
    centralWidget->setLayout(layout);
    setCentralWidget(centralWidget);

    connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::onButtonClicked()
{
    label->setText("Button Clicked!");
}


在C++的Qt框架中,MainWindow::MainWindow(QWidget *parent)MainWindow类的构造函数,它负责初始化这个类的对象。在这个构造函数中,有几个关键的部分需要详细解释,特别是button(new QPushButton("Click Me", this)), label(new QLabel("Hello, World!", this))这一部分。

成员变量初始化列表

首先,构造函数使用了一个称为“成员变量初始化列表”的特性来初始化类的成员变量。这是C++推荐的做法,因为它通常比在构造函数体内赋值更高效,特别是对于大型对象或需要复杂构造的对象来说。

buttonlabel的初始化

  • button(new QPushButton("Click Me", this)),
  • label(new QLabel("Hello, World!", this))

这两行代码做了以下几件事:

  1. 动态分配内存new关键字用于在堆上动态分配内存。这意味着QPushButtonQLabel对象不会在栈上自动销毁,而是需要手动管理它们的生命周期(通常是通过智能指针或确保在适当的时候调用delete)。

  2. 创建对象QPushButton("Click Me", this)创建了一个按钮对象,其上的文本为“Click Me”。第二个参数this是指向当前MainWindow对象的指针,它将按钮的父对象设置为MainWindow。在Qt中,设置父对象意味着子对象(如按钮)的生命周期将由父对象管理,当父对象被销毁时,子对象也会被自动销毁。

    类似地,QLabel("Hello, World!", this)创建了一个标签对象,其上的文本为“Hello, World!”,并将其父对象设置为MainWindow

  3. 初始化成员变量:这些对象被赋值给MainWindow类的成员变量buttonlabel。这意味着在MainWindow类的其他部分可以访问这些控件,以修改它们的属性或连接信号和槽。

注意点

  • ui成员变量:在构造函数中,ui(new Ui::MainWindow)也使用了类似的语法来初始化ui成员变量。然而,这里ui是一个指向由Qt Designer生成的UI类的指针,它通常包含了界面上所有控件的引用和布局信息。setupUi(this)函数被调用以设置这些控件的实际界面。

  • 布局管理:在构造函数中,还创建了一个QVBoxLayout布局,并将按钮和标签添加到这个布局中。然后,这个布局被设置为一个新创建的QWidget(作为中央部件)的布局。这确保了按钮和标签将按照垂直布局排列在MainWindow中。

  • 信号和槽的连接:最后,使用connect函数将按钮的clicked信号连接到MainWindow类的onButtonClicked槽。这意味着当按钮被点击时,onButtonClicked函数将被调用。

效果:

button(new QPushButton("Click Me", this)), label(new QLabel("Hello, World!", this))这两行代码在MainWindow的构造函数中动态创建了按钮和标签控件,并将它们分别初始化为类的成员变量。这些控件被添加到布局中,并最终显示在MainWindow界面中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值