背景
当开发工具经常会默认给你生成一些结构的时候,就会忽视一个问题
//构造函数1
class DraggableButton : public QPushButton {
DraggableButton(QWidget* parent = nullptr){
}
};
//构造函数2
class DraggableButton : public QPushButton {
DraggableButton(QWidget* parent = nullptr): QPushButton(parent){
}
};
AI是这么给我解释的:
在构造函数1中,DraggableButton
的构造函数没有显式地调用其基类 QPushButton
的构造函数。当派生类构造函数没有显式调用基类构造函数时,C++ 会自动调用基类的默认构造函数(如果存在的话)。如果 QPushButton
类没有默认构造函数(比如它只有带参数的构造函数),则这个代码将无法编译,因为编译器不知道如何用默认参数来构造基类对象。
然而,在这个特定的例子中,由于 QPushButton
确实有一个默认构造函数(它继承自 QWidget
,而 QWidget
有一个默认构造函数),这个代码是合法的,但基类 QPushButton
是通过其默认构造函数被初始化的,这可能不是你所期望的(特别是如果 QPushButton
的默认构造函数不设置你需要的属性或状态)。
在构造函数2中,DraggableButton
的构造函数显式地调用了基类 QPushButton
的带有一个 QWidget* parent
参数的构造函数。这样做的好处是,你可以确保 QPushButton
以你期望的方式被初始化,特别是如果你需要设置父对象或者有其他特定的初始化需求。
此外,显式调用基类构造函数也是一种更清晰、更明确的编程风格,它明确表明了 DraggableButton
是如何构建其基类部分的。
- 构造函数1:隐式地调用基类的默认构造函数(如果存在)。
- 构造函数2:显式地调用基类的一个特定构造函数(在这个例子中是带有一个
QWidget* parent
参数的构造函数),这允许更精确的控制基类对象的初始化。
但是,我觉得有一点:
我碰到的情况:
如果你自定义了一个Button 想要它独立于新的窗口上,那么使用第一种方式。
如果你自定义了一个Button 想要它依附于一个窗口上,那么你需要用到第二种方式,因为,传递的参数有父对象的指针。