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

《Effective C++》条款21

必须返回对象时,别妄想返回其reference

如果你的运算符重载函数写成了返回reference的形式:

class A
{
public:A(int a,int b):x(a),y(b){}friend const A& operator*(const A& a, const A& b);
private:int x;int y;
};
const A& operator*(const A& a, const A& b)
{A aa(a.x * b.x, a.y / b.y);return aa;
}

但是这样写是错误的,一旦使用引用返回前,一定要想清楚当前引用的对象在哪,是谁,而函数内的对象是在stack上创建的,一旦函数栈帧被销毁,那么该stack上的值也不复存在。那么引用它必然接收不到任何值。

如果在heap上开辟对象:

const A& operator*(const A& a, const A& b)
{A* aa = new A(a.x * b.x, a.y / b.y);return *aa;
}

存在的问题是:

A a, b, c, d;
a = b * c * d;

如果这样写,那么会调用两次operator* , 所以使用了两次new。同时就需要两次delete才能保证内存不泄露,但是却没有合理的办法让operator*使用者进行那些delete调用,因为没有合理的办法让他们取得operator*返回的引用指向一个被定义于函数内部的static A对象。

如果定义对象为static类型:

const A& operator*(const A& a, const A& b)
{static A ret(0,0);ret= A(a.x * b.x, a.y / b.y);return ret;
}

存在的问题是:

1.存在了线程安全问题。

2.

const bool operator==(const A& a, const A& b)
{A a, b, c, d;if ((a * b) == (c * d)){}else{}
}

表达式(a * b) == (c * d)总是被核算为true,因为上述式子等价于:

if(operator==operator*(a,b),operator*(c,d))

两次operator确实改变了它们的值,但是由于它们返回的都是reference,因此调用者看到的都是static A对象的“现值”

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

相关文章:

  • 决策树,sql考题,30个经典sql题目
  • 【ES6.0】- 扩展运算符(...)
  • 关于Java中的深拷贝与浅拷贝
  • 13.真刀实枪做项目---博客系统(页面设计)
  • VScode 配置用户片段
  • Fedora 项目近日发布了 Fedora Linux 39
  • Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)
  • GCD:异步同步?串行并发?一文轻松拿捏!
  • 学习c#的第十七天
  • 龙芯 操作系统选择和安装
  • 【开源】基于JAVA的智能停车场管理系统
  • 使用IDEA 将Eclipse java工程转为maven格式
  • CCF CSP认证 历年题目自练Day47
  • LeetCode Hot100之十:239.滑动窗口最大值
  • x264、x265、OpenH264 简要对比
  • 二维码智慧门牌管理系统升级解决方案:门牌聚合,让管理更便捷!
  • 物联网AI MicroPython学习之语法UART通用异步通信
  • Git企业开发级讲解(四)
  • pytorch 安装 2023年
  • 人工智能基础_机器学习040_Sigmoid函数详解_单位阶跃函数与对数几率函数_伯努利分布---人工智能工作笔记0080
  • Scala---迭代器模式+Trait特质特性
  • labview运行速度太慢
  • QT基础入门【QSS】继承、命名空间中的小部件、QObject 属性介绍
  • Ubuntu18.04安装IgH主站
  • HTML5-原生History
  • 无需公网IP,使用MCSM面板一键搭建我的世界Minecraft服务器联机游戏
  • 高斯积分-Gaussian Quadrature
  • Linux下非root用户安装CUDA
  • 【bugfix】安装 flash-attn 报错
  • 技术实践|高斯集群服务器双缺省网关故障分析