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

C++ 中面向对象的接口设计杂谈

C++ 中面向对象的接口设计杂谈

原地修改?返回新对象?

我们来学点语法,关于 C++ 中类的 API 设计。

class Image {
public:// 原地修改版本Image& rotate(double angle) {// 实现...return *this;}// 返回新对象版本Image rotated(double angle) const {Image copy = *this;copy.rotate(angle);  // 重用原地修改的实现return copy;}
};

有时需要维护一个对象的操作,这个操作的自修改写法比较简单,但是我们难免可能用到需要原对象不变而返回新对象的操作,我们可以像上面 rotated 函数一样写三行,复制-修改-返回(你最好别写别的;如果对象很大的话,这是最优解)。对应的 rotate 函数可以 return *this; 方便进行链式调用。

如果是反过来,自修改比较难绷,返回新对象的写法比较简单,那就写成静态成员函数或外部友元函数(如果全是 public 成员,写外部函数也行)。对应的自修改版本则直接 *this = func(*this);。例如 operator+ 比较简单,你就写这个,然后需要用到 operator+= 的时候,就 return *this = *this + rhs;

引用延长生存期的规则

另外有一个难绷的误区,const auto&auto&& 两个引用延长生存期,是当把临时对象绑定到它们时延长生存期,不是把引用绑定到它们,这可能导致悬垂引用。典型的误区形如用 const auto&auto&& 接受一个返回 auto& 的函数的返回值,这是可能错误的,如果这个引用是临时对象的(典型如临时对象的 return *this),那么就会爆炸,直接用 auto 接受就可以了。但也不是说它们就不能接受引用了,只要你能保证引用所指的位置不会被提前析构掉就能接受。即要么绑定临时对象,要么绑定到生存期更长的对象的引用,否则将悬垂。注意绑定到临时对象的一部分也是悬垂,这和绑定临时对象引用是一个原理。

一个难绷的例子是 std::minmax - cppreference.cn - C++参考手册。如果 minmax 其中一个参数是临时对象,则返回的引用在包含对 minmax 调用的完整表达式结束时会变成悬空引用。这个例子套了一层 pair,问题会比较隐蔽。

int n = 1;
auto p = std::minmax(n, n + 1);
int m = p.first; // ok
int x = p.second; // undefined behavior
 
// Note that structured bindings have the same issue
auto [mm, xx] = std::minmax(n, n + 1);
xx; // undefined behavior

那当然 std::min - cppreference.cn - C++参考手册也一样有问题。如果其中一个参数是临时变量并且返回该参数,则通过引用捕获 std::min 的结果也会产生悬空引用。

int n = -1;
const int& r = std::min(n + 2, n * 2); // r is dangling
http://www.jsqmd.com/news/307218/

相关文章:

  • 2026钙钛矿外观缺陷检测设备技术应用与发展动态
  • 最新靠谱京东e卡回收平台指南
  • HoRain云--深入解析Linux内核current机制
  • 百考通AI:您的智能学术加速器,让期刊论文写作从“苦差事”变“快车道”
  • 百考通AI:您的智能数据分析师,让复杂洞察一键生成
  • 百考通AI:您的智能问卷设计专家,让调研从“耗时耗力”到“一键生成”
  • AlphaFold五年成就:AI重塑生物学研究
  • 百考通AI:引领智能学习新纪元,打造个性化备考全能助手
  • 百考通AI:不只是降重,更是质量重塑的智能写作伙伴
  • 百考通AI:智能文本处理的终极入口,您的高效写作与学习伙伴
  • Redis各种架构安装部署
  • 百考通AI:您的智能文献研究伙伴,从标题到参考文献一站智成
  • 百考通AI:您的智能学术助手,让开题报告写作化繁为简
  • 矿山“数字皮带秤”:AI纠偏让输送损耗<0.2%
  • 空气源热泵机组远程监控与能源管理系统方案
  • 解读上海、苏州PCBA厂商口碑,推荐几家可靠的?
  • 关注2026年1月,口碑佳的有机肥造粒机实力厂家排行来了,药材粉碎机/高速粉碎机/大型木材粉碎机,造粒机供应商选哪家
  • 高温持久蠕变试验机选购指南:哪个品牌质量好、耐用且口碑佳?
  • 详细介绍:数据分析报表如何选?详解 DataEase 四大表格:明细表、汇总表、透视表与热力图的适用场景与选择策略
  • 如何防范日益增长的数据威胁?
  • 关于操作系统内核
  • 2026年特色老火锅加盟排名,重庆崽儿火锅靠谱之选不容错过
  • linux怎么把 RX ring 调大
  • 进口岩板品牌供应商哪家好,三亚广州值得选的品牌
  • 这才是多数据源的正确打开方式!MyBatis-Plus vs Hibernate 底层原理大揭秘,别再瞎配了
  • 盘点工业打包机直销品牌,蓝景自动化性价比排名前列
  • 省选集训 15 - 交互题
  • 2026年三亚靠谱的汽车租赁门店联系电话,包头到三亚靠谱的汽车租赁公司联系方式技术实力与市场口碑领航者
  • 高清免费正版图片素材网站推荐:2026年十大图库资源平台盘点
  • 上海宠物牙科口碑之选:姚志权医生领衔的专业力量,宠物牙科/猫咪口腔/宠物口腔科/狗狗口腔,宠物牙科医生哪个比较好