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

赋值运算符重载

背景:

在EHR模块进行调试时,发现QVector3D对象进行赋值时,出现变量未赋值成功问题。

问题描述:

在进行代码调试时,发现赋值操作未成功,导致代码逻辑异常,经过分析,发现QVector3D 赋值重载函数存在问题,返回一个临时对象,从而导致赋值失败。

const QVector3D operator=(const QVector3D& in) const {
    return QVector3D(in.p[0], in.p[1], in.p[2]);
}

问题解决:

重写赋值重载函数:

QVector3D& operator=(const QVector3D& in) {
    if (this != &in) { // 防止自我赋值
        p[0] = in.p[0];
        p[1] = in.p[1];
        p[2] = in.p[2];
    }
    return *this; // 返回当前对象的引用
}

代码测试正常:

QVector3D a(1.0f, 2.0f, 3.0f);
QVector3D b;
QVector3D c;

b = a; // b 被正确赋值
c = b = a; // 赋值链式调用成功

这样,bc 都会被正确赋值,因为 operator= 返回的是对当前对象的引用,而不是一个新的对象。这样不仅符合 C++ 的语义,而且避免了不必要的性能开销和潜在的内存管理问题。

如果 operator= 返回一个新的 QVector3D 对象而不是 *this 的引用,将会导致一些问题,主要体现在以下几个方面:

  1. 违背了赋值运算符的语义:

    1. 按照惯例,赋值运算符应该返回对左值对象(即被赋值的对象)的引用。这允许赋值操作可以链式调用,例如 a = b = c;

    2. 返回一个新的对象会导致这种链式调用的行为不正确。

  2. 效率问题:

    1. 每次调用赋值运算符时都创建一个新的对象会引入不必要的开销。通常,赋值运算符直接修改已有对象,避免了创建和销毁临时对象的开销。

  3. 潜在的内存管理问题:

    1. 如果类中涉及动态内存管理,返回一个新的对象可能会导致内存泄漏或双重释放,因为赋值运算符应该直接操作已有对象,而不是创建新的对象。


http://www.kler.cn/a/323227.html

相关文章:

  • AUTOSAR_EXP_ARAComAPI的7章笔记(5)
  • Jenkins下载安装、构建部署到linux远程启动运行
  • [241115] Debian 12.8 发布 | Mistral AI 推出批量 API,成本降低 50%
  • 数据集的重要性:如何构建AIGC训练集
  • LlamaIndex+本地部署InternLM实践
  • LeetCode 90-子集Ⅱ
  • python 实现harmonic series调和级数算法
  • 现代LLM基本技术整理
  • Android13高通平台拨打/接听只有免提模式,无听筒模式
  • unsqueeze函数、isinstance函数、_VF模块、squeeze函数
  • 爆火!大模型算法岗 100 道面试题全解析,赶紧收藏!
  • STM32CUBEIDE FreeRTOS操作教程(五):mutex互斥信号量
  • Python中的null是什么?
  • 基于SpringBoot+Vue的小儿推拿培训管理系统
  • MySQL按照经纬度排序 查询出商家信息
  • Cisco ASA 9.22.1 发布下载,新增功能概览
  • Mysql—主从复制的slave添加及延迟回放
  • 2024年7月大众点评乌鲁木齐美食店铺基础信息
  • 物理学基础精解【26】
  • .NET MAUI(.NET Multi-platform App UI)上下文菜单
  • 【Redis入门到精通六】在Spring Boot中集成Redis(含配置和操作演示)
  • 机器学习查漏补缺(5)
  • 【刷题5】在排序数组中查找元素的第一个和最后一个位置
  • Android CCodec Codec2 (十五)C2DmaBufAllocator
  • 自动化办公-python中的open()函数
  • 深入理解 Nuxt.js 中的 app:error:cleared 钩子