当前位置: 首页 > news >正文

【QT】-explicit关键字

  1. explicit
    explicit 是一个 C++ 关键字,用于修饰构造函数。它的作用是防止构造函数进行隐式转换。

为什么需要 explicit?

在没有 explicit 的情况下,构造函数可以用于隐式类型转换。这意味着,如果你有一个接受某种类型的参数的构造函数,而传递给它的参数类型不完全匹配,它可能会自动进行类型转换。
但有时候这种隐式转换会导致不希望的行为或编译错误。为了避免这种情况,使用 explicit 修饰构造函数可以确保该构造函数只会通过显式的调用来使用。
举个例子:

class ClassB {
public:ClassB(int value);  // 非explicit构造函数
};

ClassB obj = 42; // 隐式转换 int 到 ClassB
这样代码是有效的,因为 ClassB(int) 构造函数可以接受一个 int 类型的值,编译器会自动将 42 转换为 ClassB 对象。

而如果构造函数声明为 explicit:

class ClassB {
public:explicit ClassB(int value);  // 显式构造函数
};
那么:cppClassB obj = 42;  // 编译错误
只有明确调用构造函数时,才会有效:ClassB obj(42);  // 正常调用

总结:

explicit 修饰构造函数后,防止了隐式类型转换,确保构造函数只会在显式调用时执行。
2. *ClassB(QObject parent = nullptr)
这是 ClassB 的构造函数的声明部分。构造函数有一个参数 QObject *parent,其默认值为 nullptr。

*QObject parent:在 Qt 中,很多类都继承自 QObject,并且很多对象的生命周期是由父子关系来管理的。通常,Qt 对象(如 QWidget)可以有一个父对象,父对象负责管理子对象的销毁。当父对象被销毁时,所有子对象也会被销毁。

parent = nullptr:这是一个默认参数,表示如果在创建 ClassB 对象时没有显式传递父对象,那么 parent 默认就是 nullptr。这样做的好处是,如果不需要父对象的管理,构造时就可以不传递该参数。

例如:

cpp
ClassB classB; // parent 默认为 nullptr
或者,如果需要设置父对象:cppClassB classB(parentObject);  // parentObject 是另一个 QObject 类型的对象

为什么要有 parent 参数?

在 Qt 中,父对象(如一个窗口部件)会自动管理其子对象(如按钮、标签等)。如果 parent 被设置为某个对象,ClassB 的生命周期将与该父对象绑定。父对象销毁时,它的所有子对象也会自动销毁。
3. *QObject parent = nullptr 与 nullptr 的使用
nullptr 是 C++11 引入的关键字,用于表示空指针,代替了以前的 NULL 或 0。它是类型安全的,确保不会出现将 0 误用作指针的问题。
这里的 parent = nullptr 表示默认情况下,ClassB 不会绑定父对象。如果需要,可以传递一个具体的父对象。
总结
explicit 关键字防止隐式类型转换。
QObject *parent = nullptr 是构造函数的默认参数,表示对象默认没有父对象,如果需要父对象管理,可以显式传递。
在 Qt 中,父对象管理子对象的生命周期,确保子对象在父对象销毁时一同销毁。

http://www.lryc.cn/news/525694.html

相关文章:

  • 【深度学习】 自动微分
  • 字节跳动自研HTTP开源框架Hertz简介附使用示例
  • skynet 源码阅读 -- 核心概念服务 skynet_context
  • 每日十题八股-2025年1月23日
  • MongoDB部署模式
  • opencv笔记2
  • springboot使用ssl连接elasticsearch
  • Linux内核中的InfiniBand核心驱动:verbs.c分析
  • 把网站程序数据上传到服务器的方法和注意事项
  • 完全平方数——唯一分解定理
  • (详细)Springboot 整合动态多数据源 这里有mysql(分为master 和 slave) 和oracle,根据不同路径适配不同数据源
  • mock可视化生成前端代码
  • Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
  • 鸿蒙Harmony json转对象(1)
  • 常见的RocketMQ面试题及其简要答案
  • C#Object类型的索引,序列化和反序列化
  • Unity3D项目开发中的资源加密详解
  • 微调Qwen2:7B模型,加入未知信息语料
  • 【Ubuntu】安装SSH启用远程连接
  • 【理论】测试开发工程师进阶路线
  • 【BQ3568HM开发板】如何在OpenHarmony上通过校园网的上网认证
  • 動態住宅IP提升網站訪問成功率
  • 2024年博客之星主题创作|2024年蓝桥杯与数学建模年度总结与心得
  • Spring Boot/MVC
  • 由于请求的竞态问题,前端仔喜提了一个bug
  • 【Day25 LeetCode】贪心Ⅲ
  • 蓝桥杯练习日常|递归-进制转换
  • AI Agent:深度解析与未来展望
  • 《SwinIR:使用Swin-Transformer图像恢复》学习笔记
  • 如何在Nginx服务器上配置访问静态文件目录并提供文件下载功能