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

Effective C++ 条款 12:复制对象时勿忘其每一个成分

文章目录

    • 条款 12:复制对象时勿忘其每一个成分
      • 核心问题
      • 示例:完整复制对象
      • 示例:提取公共逻辑
      • 设计建议
      • 总结

条款 12:复制对象时勿忘其每一个成分

核心问题

  • 对象的完整性
    在实现复制操作(包括拷贝构造函数和赋值操作符)时,必须确保复制对象的所有成员变量和基类部分,否则可能导致对象不完整或行为异常。

  • 常见误区
    尝试通过一个复制函数(如拷贝构造函数)直接调用另一个复制函数(如赋值操作符)来简化逻辑。这种方法容易导致重复代码或遗漏某些成分。


示例:完整复制对象

实现拷贝构造函数和赋值操作符时,需分别处理成员变量和基类成分。

class Base {
protected:
  int baseValue;
public:
  Base(int val) : baseValue(val) {}
  Base(const Base& rhs) : baseValue(rhs.baseValue) {}  // 复制 Base 成分
  Base& operator=(const Base& rhs) {
    if (this != &rhs) {
      baseValue = rhs.baseValue;
    }
    return *this;
  }
};

class Derived : public Base {
private:
  std::string derivedValue;
public:
  Derived(int baseVal, const std::string& str) 
    : Base(baseVal), derivedValue(str) {}

  Derived(const Derived& rhs) 
    : Base(rhs), derivedValue(rhs.derivedValue) {}  // 调用 Base 的拷贝构造函数

  Derived& operator=(const Derived& rhs) {
    if (this != &rhs) {
      Base::operator=(rhs);             // 调用 Base 的赋值操作符
      derivedValue = rhs.derivedValue;  // 复制 Derived 成分
    }
    return *this;
  }
};

关键点:

  1. 成员变量复制:每个成员变量都需要在复制函数中被正确处理。
  2. 基类复制:显式调用基类的拷贝构造函数或赋值操作符,确保基类成分被完整复制。

示例:提取公共逻辑

为了避免重复代码,可以将共同逻辑提取到一个辅助函数中。

class Widget {
private:
  int id;
  std::string name;

  void copyFrom(const Widget& rhs) {
    id = rhs.id;
    name = rhs.name;
  }

public:
  Widget(int i, const std::string& n) : id(i), name(n) {}

  Widget(const Widget& rhs) {
    copyFrom(rhs);  // 使用公共函数处理复制逻辑
  }

  Widget& operator=(const Widget& rhs) {
    if (this != &rhs) {
      copyFrom(rhs);  // 避免重复代码
    }
    return *this;
  }
};

关键点:

  1. 提取公共逻辑到 copyFrom 函数,减少代码重复。
  2. 确保拷贝构造函数和赋值操作符调用相同的逻辑。

设计建议

  1. 完整性检查

    • 确保每个成员变量和基类成分都被正确复制。
  2. 避免重复代码

    • 提取共同逻辑到辅助函数,提高代码复用性。
  3. 基类与派生类

    • 派生类复制函数应显式调用基类的复制函数。

总结

  • 在实现复制操作时,确保对象的每一个成员变量和基类成分都被正确处理。
  • 避免重复代码,将复制逻辑提取到辅助函数中。
  • 始终遵循良好的设计原则,确保代码的可维护性和正确性。

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

相关文章:

  • .NET 8.0 项目升级到 .NET 9.0
  • 利用Java爬虫速卖通按关键字搜索AliExpress商品
  • 流量主微信小程序工具类去水印
  • 基于大涡模拟与中尺度数值天气模式的精细化风场模拟
  • 云渲染,Enscape、D5、Lumion渲染提速教程
  • Cadence学习笔记 11 PCB中器件放置
  • 嵌入式学习-QT-Day03
  • VB.NET在 Excel 二次开发中的全面应用
  • NLP 中文拼写检测开源-03-hunspell 拼写纠正算法入门介绍 CSC
  • python实现根据搜索关键词爬取某宝商品信息
  • tcp 的重传,流量控制,拥塞控制
  • MySQL:顿悟‌了,添加索引时竟然不锁表?
  • 【Java 数据结构 】反转一个单链表
  • Visual Studio2019基础使用指南
  • 每天40分玩转Django:实操多语言博客
  • Day53 图论part04
  • Stable Diffusion绘画 | 电商设计海报
  • hhdb客户端介绍(57)
  • 7种server的服务器处理结构模型
  • lv_ffmpeg学习及播放rtsp