当前位置: 首页 > 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/news/323227.html

相关文章:

  • 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 钩子
  • 【hot100-java】【划分字母区间】
  • 消息中间件 Kafka 快速入门与实战
  • 让具身智能更快更强!华东师大上大提出TinyVLA:高效视觉-语言-动作模型,遥遥领先
  • mysql复合查询 -- 合并查询(union,union all)
  • 指令个人记录
  • Lab1:虚拟机kolla安装部署openstack,并创建实例
  • [大语言模型-论文精读] MoRAG - 基于多部分融合的检索增强型人体动作生成
  • 海尔嵌入式硬件校招面试题及参考答案
  • Python in Excel作图分析实战!
  • 关于Obj文件格式介绍与Unity加载Obj文件代码参考