//在 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;
}