构造函数后面跟父类名与不带父的区别

背景

当开发工具经常会默认给你生成一些结构的时候,就会忽视一个问题
 

//构造函数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 想要它依附于一个窗口上,那么你需要用到第二种方式,因为,传递的参数有父对象的指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值