Qt 成员初始化列表 代码解读

//在 mainwindow.h 中
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);

private:
    Ui::MainWindow *ui;
    int a;
}


// 解读这段构造函数
MainWindow::MainWindow(QWidget *parent)
  : QMainWindow(parent)
  , ui(new Ui::MainWindow) // ui = =new Ui::MainWindow ;
  , a(99) // a = 99;
{
   ....
  // 首先  a(99) // a = 99; 就是等效于 a = 99 , ui(new Ui::MainWindow) 同理ui = =new Ui::MainWindow ;
  // QMainWindow(parent) 这句话什么意思
}

// 举个例子,两个class, 一个 Animal ,一个Dog,Dog继承Animal。
class Animal 
{
public:
    Animal(QString owner = "无主人") {
        this->m_owner = owner;
        qDebug() << "【Animal 初始化】动物的主人:" << m_owner;
    }
protected:
    QString m_owner;
};

class Dog : public Animal 
{
public:
    Dog(QString owner = "无主人");

    // 子类专属方法
    void bark();

private:
    QString m_breed; // 狗的品种
};

// Dog的构造函数
Dog::Dog(QString owner)
    : Animal(owner) // 重点!!!!
    , m_breed("金毛") //m_breed = "金毛"
{
    qDebug() << "【Dog 初始化】狗的专属能力已就绪(摇尾巴/叫)";
    qDebug() << "狗的品种:" << m_breed;
}

// bark 实现
void Dog::bark() {
    qDebug() << "【" << m_breed << "】对着 " << m_owner<< " 叫:汪汪汪!"; 吗?
}

int main()
{
  // 两种
  Dog dog1("小明"); // 指定主人
  dog1.bark();

  Dog dog2; // 默认,无主人,Dog(QString owner = "无主人");
  dog2.bark();
  return 0;
}

//灵活一点
class Dog : public Animal {
public:
    // 声明:支持自定义品种+主人,都给默认值(符合 Qt 构造函数风格)
    explicit Dog(QString breed = "金毛", QString owner = "无主人");
    void bark();
private:
    QString m_breed;
};

// 定义:参数和声明完全一致,不重复写默认参数
Dog::Dog(QString breed, QString owner)
    : Animal(owner)  // 先初始化父类(主人)
    , m_breed(breed) // 再初始化子类专属属性(品种)
{
    qDebug() << "【Dog 初始化】狗的品种:" << m_breed;
}

int main() 
{
    Dog dog1; // 默认:金毛 + 无主人
    dog1.bark(); // 【金毛】对着 无主人 叫:汪汪汪!

    Dog dog2("哈士奇"); // 自定义品种:哈士奇 + 默认主人
    dog2.bark(); // 【哈士奇】对着 无主人 叫:汪汪汪!

    Dog dog3("柴犬", "小红"); // 自定义品种+主人
    dog3.bark(); // 【柴犬】对着 小红 叫:汪汪汪!
    return 0;
}


posted @ 2026-03-30 02:06  一见无始道成空  阅读(0)  评论(0)    收藏  举报