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

C++法则8:对于有引用成员的类,合成拷贝赋值运算符被定义为删除的。

C++法则8:对于有引用成员的类,合成拷贝赋值运算符被定义为删除的。

在 C++ 中,Rule of 8(法则 8)并不是一个官方术语,但通常指与特殊成员函数(如拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符等)相关的规则。这里提到的规则实际上是关于类中包含引用成员时,拷贝赋值运算符的行为

法则 8 的解释

如果一个类包含引用成员,那么编译器会自动将合成的拷贝赋值运算符(operator=)定义为 deleted(删除的)。

为什么?

  • 引用(T&)一旦初始化后就不能再绑定到另一个对象。因此,默认的拷贝赋值运算符(尝试逐个成员赋值)无法正确修改引用成员所引用的目标。

  • 如果允许默认的拷贝赋值,可能会导致意外的行为或违反引用的语义。

示例

#include <iostream>class RefHolder {
public:int& ref;  // 引用成员RefHolder(int& x) : ref(x) {}// 编译器不会生成默认的拷贝赋值运算符(它会被定义为 deleted)
};int main() {int a = 10, b = 20;RefHolder obj1(a);RefHolder obj2(b);// obj1 = obj2;  // 错误!拷贝赋值运算符是 deleted 的return 0;
}
  • 如果你尝试 obj1 = obj2;,编译器会报错,因为 RefHolder 的拷贝赋值运算符是 deleted 的。

如何解决?

如果类包含引用成员,并且你确实需要支持拷贝赋值,必须手动定义拷贝赋值运算符

class RefHolder {
public:int& ref;RefHolder(int& x) : ref(x) {}// 手动定义拷贝赋值运算符RefHolder& operator=(const RefHolder& other) {ref = other.ref;  // 注意:这里修改的是引用指向的值,而非引用本身return *this;}
};
  • 但要注意,这样并不会改变 ref 引用的对象,而是修改 ref 指向的值。

总结

  • 如果类有引用成员,合成的拷贝赋值运算符会被 deleted。

  • 如果需要拷贝赋值,必须手动定义。

  • 引用成员在赋值时不会改变绑定,只能修改被引用的值。

这个规则是 C++ 对象模型的一部分,确保引用语义的正确性。

http://www.xdnf.cn/news/1065043.html

相关文章:

  • Java八股文——系统场景设计
  • 多设备Obsidian笔记同步:WebDAV与内网穿透技术高效实现教程
  • 从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革
  • Linux->进程概念(精讲)
  • GPU机器安装docker
  • Python下构建毫秒级低延迟RTSP/RTMP播放器并实现AI视觉处理
  • 数据库(1)-SQL
  • EXPLAIN优化 SQL示例
  • Oracle 数据库查询:单表查询
  • 统计用户本月的连续登录天数
  • 62-Oracle ADR(Automatic Diagnostic Repository)
  • 量化-因子处理
  • 【递归,搜索与回溯算法】记忆化搜索(二)
  • Vue.js数据代理与事件处理全解析:从原理到实践
  • 【DDD】——带你领略领域驱动设计的独特魅力
  • React基础
  • MakeItTalk: Speaker-Aware Talking-Head Animation——说话者感知的说话头动画
  • 【笔记】Windows 系统迁移 Ubuntu(Preview)应用到其他磁盘
  • Element表格表头合并技巧
  • 第八章 目录一致性协议 A Primer on Memory Consistency and Cache Coherence - 2nd Edition
  • Bytemd@Bytemd/react详解(编辑器实现基础AST、插件、跨框架)
  • 分库分表下的 ID 冲突问题与雪花算法讲解
  • JVM(10)——详解Parallel垃圾回收器
  • python高校教务管理系统
  • 超详细YOLOv8/11图像菜品分类全程概述:环境、数据准备、训练、验证/预测、onnx部署(c++/python)详解
  • TypeScript类型定义:Interface与Type的全面对比与使用场景
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(三十六) -> 配置构建(三)
  • 算法导论第二十五章 深度学习的伦理与社会影响
  • C4.5算法深度解析:决策树进化的里程碑
  • 怎么让二级域名绑定到wordpesss指定的页面