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

基于Python的闲鱼商品价格评估模型:爬虫+价格预测全实现 本文介绍了一个完整的全球气候数据抓取与分析流程,采用轻量化的技术栈(requests+pandas+matplotlib+folium),实现以下核心功能: 全球城市定向抓取:支持自定义城市列表,自动获取经纬度并抓取多源气候数据 双数据源互补:结合OpenWeatherMap API(实时数据)和Climate-Data.org(历史数据) 全维度覆盖:采集气温、降水、湿度等核心指标,并进行自动化清洗转换 丰富可视化:生成热力图、趋势图和统计图表,支持地理定位展示 灵活扩展:模块化设计便于新增城市或扩展数据 阅读详情

在C++中,拷贝构造函数和拷贝赋值操作符是用于管理对象拷贝行为的两个重要成员函数,如果不进行自定义实现,编译器默认会默认实现这两个函数。
1、自定义对象,内部属性都是基本数据类型
编译器默认行为:

  • 如果类的所有成员变量都是基本数据类型(如int、flaot、double等),编译器会自动生成默认的拷贝构造函数靠拷贝赋值操作符。這些默认实现会逐个拷贝每个成员变量的值。
  • 采用浅拷贝方式。对于基本数据类型,浅拷贝是安全的,不会引发问题。
class SimpleClass {
public:
    int a;
    double b;
};

int main() {
    SimpleClass obj1;
    obj1.a = 10;
    obj1.b = 3.14;

    // 调用默认拷贝构造函数
    SimpleClass obj2 = obj1;

    // 调用默认拷贝赋值操作符
    SimpleClass obj3;
    obj3 = obj1;

    return 0;
}

2、自定义对象,内部属性存在其他自定义类型的对象,或者有数组类型
编译器默认行为:

  • 如果类的成员变量包含其他自定义类型的对象,编译器会递归调用這些对象的拷贝构造函数或拷贝赋值操作符。对于数组类型,编译器会逐个拷贝数组中的每个元素。
  • 编译器默认行为是浅拷贝,对于inner成员,会调用InnerClass的默认拷贝构造函数,如果InnerClass或数组元素是动态分配的资源,浅拷贝会导致双重释放问题。
class InnerClass {
public:
    int x;
};

class OuterClass {
public:
    InnerClass inner;
    int arr[3];
};

int main() {
    OuterClass obj1;
    obj1.inner.x = 10;
    obj1.arr[0] = 1;
    obj1.arr[1] = 2;
    obj1.arr[2] = 3;

    // 调用默认拷贝构造函数
    OuterClass obj2 = obj1;

    // 调用默认拷贝赋值操作符
    OuterClass obj3;
    obj3 = obj1;

    return 0;
}

3、对象存在继承关系,父类有自己的属性
编译器默认行为:

  • 如果类存在继承关系,编译器会先调用父类的拷贝构造函数或拷贝赋值操作符,然后再拷贝子类的成员变量。
  • 因为编译器默认采用的是浅拷贝的方式,如果父类或子类的成员变量涉及动态资源管理,会导致资源释放问题。
class Base {
public:
    int baseData;
};

class Derived : public Base {
public:
    int derivedData;
};

int main() {
    Derived obj1;
    obj1.baseData = 10;
    obj1.derivedData = 20;

    // 调用默认拷贝构造函数
    Derived obj2 = obj1;

    // 调用默认拷贝赋值操作符
    Derived obj3;
    obj3 = obj1;

    return 0;
}

4、手动实现拷贝构造函数和拷贝赋值操作符

  • 如果类的成员变量涉及动态资源管理(如指针、文件句柄等),必须手动实现拷贝构造函数和拷贝赋值操作符,采用深拷贝方式实现。
  • 手动实现深拷贝:
    • 在拷贝构造函数中,为新对象分配新的资源
    • 在拷贝赋值操作符中,先释放原有资源,再分配新的资源。
    • 注意自赋值检查,避免释放资源后访问无效内存。
class DeepCopyClass {
public:
    int* data;

    // 构造函数
    DeepCopyClass(int value) {
        data = new int(value);
    }

    // 拷贝构造函数
    DeepCopyClass(const DeepCopyClass& other) {
        data = new int(*other.data); // 深拷贝
    }

    // 拷贝赋值操作符
    DeepCopyClass& operator=(const DeepCopyClass& other) {
        if (this == &other) { // 自赋值检查
            return *this;
        }
        delete data; // 释放原有资源
        data = new int(*other.data); // 深拷贝
        return *this;
    }

    // 析构函数
    ~DeepCopyClass() {
        delete data;
    }
};

int main() {
    DeepCopyClass obj1(10);
    DeepCopyClass obj2 = obj1; // 调用拷贝构造函数
    DeepCopyClass obj3(20);
    obj3 = obj1; // 调用拷贝赋值操作符

    return 0;
}

思维导图笔记
在这里插入图片描述

00 — Intel xe SVM 内核实现精读系列专栏导读 本文系统介绍了Intel Xe GPU的共享虚拟内存(SVM)实现机制。第一部分通过概念地图阐述SVM的六个核心概念及其关系;第二部分通过三个测试用例解析SVM关键功能:fault生命周期验证、madvise与VRAM迁移、跨GPU一致性;第三部分深入内核实现,包括初始化/销毁流程、Page Fault处理、MMU Notifier失效路径、异步垃圾回收、VRAM迁移机制、madvise实现原理,以及与ROCm SVM的对比。文章建议按功能模块顺序学习,从基本概念到测试用例,再深入内核实现细节,最后对比不同 阅读详情

相关推荐

ArcGIS符号库下载 | 制图规范、三调、1:1万地形图、土地利用总体规划图.....

最近整理了一些符号库 涉及的类型比较多 包含有三调的(二调的也加上去了),一些点线面符号库,1:1万地形图,1:5万土地利用,土地利用总体规划图

qq_43173805的博客 2万+

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

Effective_C++_12

君鼎的博客 620

SIPVicious实战指南:从零开始掌握VoIP渗透测试(Kali Linux环境)

本文为SIPVicious实战指南,详细介绍了在Kali Linux环境下进行VoIP渗透测试的完整流程。从环境准备与工具安装开始,逐步讲解如何使用svmap扫描SIP服务器、svwar枚举PBX分机号,以及svcrack进行密码安全测试,并整合svreport生成报告。旨在帮助安全从业者从零开始,系统掌握这套经典开源工具,在授权范围内有效评估VoIP系统的安全性。

weixin_29327977的博客 539

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

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款12:复制对象时勿忘其每一个成分 Copy all parts of an object. 编译器对“你自己写出copying函数”的复仇行为:如果你拒绝编译器为你写出copying函数,那么当你的代码不完全时...

HakunaMatata的博客 235

SGM5860x高精度ADC驱动开发与SPI接口实战指南

本文详细介绍了SGM5860x高精度ADC芯片的驱动开发与SPI接口配置实战。内容涵盖芯片特性、SPI通信设置、寄存器映射、驱动初始化、数据采集处理、校准优化及调试技巧,帮助开发者快速掌握国产24位ADC的应用,提升工业测量项目的精度与稳定性。

vvv99的博客 718

模型性能评估之 Friedman 检验与 Nemenyi 后续检验

前言 当我们提出一种算法,需要知道我们的算法和现在已有的算法相比,性能是否更优的时候,就需要用到模型性能评估的方法。本篇博客介绍一种模型性能评估的方法:Friedman 检验与 Nemenyi 后续检验。 该方法的特点是:可以进行多个算法的比较。下面看看具体的使用: 具体使用 1. 计算序值 假定我们用 D1D_1D1​、D2D_2D2​ 、D3D_3D3​ 和 D4D_4D4​ 四个数据集对算法 AAA、BBB、CCC 进行比较。首先需要得到每个算法在每个数据集上的测试结果,可以是准确率,也可以是均方误差

蕾欧娜与26的博客 1万+

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

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

weixin_42255569的博客 363

【FDTD】仿真目录(共计 16 篇)

对于完美吸收型边界条件,有时候我们需要设置将仿真结构穿过边界条件区域,具体原因可以阅读下文。在进行 S 参数扫描时,当考虑到材料的色散特性时,我们可以如下文一样选择计算群延迟。仿真,我们需要构建仿真结构与仿真区域,对于它们的尺寸,应该遵循下文进行设定。中存在多种不同的网格类型,具体可以参考下文,这部分内容仅作了解即可。尺寸的设置问题,对于 mesh 的最小尺寸,可以参考下文。的边界条件设置也十分重要,下文中我们对边界条件进行总结。仿真中我们可以设定参与仿真的模式数量,可以参考下文。尺寸的实例,详见下文。

u011699626的博客 504

Effective C++ 学习笔记 条款12 复制对象时勿忘其每一个成分

PriorityCustomer的copying函数看起来好像复制了PriorityCustomer内的每一样东西,但实际上,它只复制了PriorityCustomer声明的成员变量,但每个PriorityCustomer还内含它所继承的Customer成员变量,而那些成员变量却未被复制。如果你发现你的copy构造函数和copy assignment操作符有相近的代码,消除重复代码的做法是,建立一个新的成员函数给两者调用。如果你声明自己的copying函数,意思就是告诉编译器你不喜欢缺省实现中的某些行为。

tus00000的博客 923

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 223

示波器核心参数选型指南:带宽、采样率与嵌入式调试实战

示波器是电子工程师进行信号观测与故障诊断的基础仪器,其性能由带宽、采样率、通道数、存储深度、触发系统和探头特性共同决定。带宽定义高频响应边界,需遵循5倍法则以保障数字信号上升沿测量精度;采样率则依据奈奎斯特定理并结合工程冗余(通常≥2.5×带宽)实现可靠时域重建。二者协同影响信号完整性评估能力,尤其在UART、I²C、SPI等嵌入式总线调试中至关重要。高存储深度支持长时捕获与毛刺定位,智能触发与硬件协议解码进一步将波形分析升维至语义级。本文围绕真实嵌入式场景,解析参数间的耦合关系与典型误用陷阱。

weixin_42588877的博客 91

Effective C++ 条款12:复制对象时勿忘其每一个成分(重要且常用的条款)

这一篇博客记录我学习Effective C++ term12的学习笔记! Effective C++ term12 教会我:复制对象时勿忘其每一个成分(重要且常用的条款)

weixin_44980842的博客 442

Python爬虫实战:东方财富股吧与雪球舆情数据实时爬取与情绪指标挖掘

本文详细介绍如何使用Python爬虫技术实时爬取东方财富股吧和雪球平台的讨论数据,结合股价波动构建情绪分析指标。我们将使用最新的异步爬虫技术、自然语言处理方法和可视化工具,为量化交易提供数据支持。文章包含完整的代码实现和技术细节,适合有一定Python基础的读者学习。

2201_76125261的博客 1224

【穿越Effective C++】条款12:复制对象时勿忘其每一个成分——完整对象拷贝的艺术

将完整拷贝视为C++类设计的基本契约。培养"拷贝完整性思维"——在实现每个拷贝操作时都问自己:“这个操作是否复制了对象的完整状态?包括所有基类部分和所有数据成员?” 这种系统性的思考方式是构建正确C++类的关键

沐怡旸的专栏 943

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

weixin_34292924的博客 128

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

读书笔记《Effective C++》条款12:复制对象时勿忘其每一个成分

“编译器生成版”的copy构造函数和copy assignment操作符行为:将被拷对象的所有成员变量都做一份copy。 如果你声明自己的copying函数,意思就是告诉编译器不喜欢缺省实现中的某些行为。编译器仿佛被冒犯似的,会以一种奇怪的方式回敬:当你的实现代码几乎必然出错时却不告诉你。 直接看例子:

Do-Program的专栏 245

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

(一) 一个继承体系的声明: class Date {...}; class Customer { public: ... private: string name; Date lastTransaction; }; class PriorityCustomer : public Customer { public: PriorityCustomer(const

u010470972的专栏 888

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

拷贝构造函数应当确保复制对象内的所有成员变量以及所有的基类成分 不要尝试以某个拷贝构造函数来实现另一个拷贝构造函数,应当将共同机制放到第三个函数中,并由两个拷贝构造函数共同调用 任何时候,只要为子类撰写拷贝构造函数,都应该注意复制其基类的成员,如果是基类的 private 成员则应该调用相应的基类函数进行复制。 ...

qq_45803411的博客 167

【effective c++】 条款12:复制对象时勿忘其每一个成分

设计良好的面向对象系统会将对象的内部封装起来,指留下两个函数负责对象拷贝,那便是带着适切名称的copy构造函数和copy assignment操作符,我们称它们为copying函数。 考虑一个类用来表示顾客,手工写出copying函数: void logCall(const std::string& funName);//构造一个log entry  class Customer  {  pu

zhangfn2011的专栏 542

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

记住:拷贝函数应该确保复制“对象内的所有成员变量”及“所有父类成分”。不要尝试以某个拷贝函数实现另一个拷贝函数。应该将共同机能放进第三个函数中,并由两个拷贝函数共同调用。下面是一个类实现了自己的拷贝函数,一起正常。 void logCall(const string& funcName); class Customer { public: ... Custom...

weixin_30515513的博客 155

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

对Effective C++的条款12:复制对象时勿忘其每一个成员 学习笔记

bukajiushang的博客 778

《Effective C++》学习笔记(条款12:复制对象时勿忘其每一个成分)

最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! C++中有两个函数负责对象拷贝,分别是拷贝构造函数和拷贝赋值运算符,我们可以统称为拷贝函数。若我们不声明自己的拷贝函数,则编译器会给你提供,若是声明了自己定义的拷贝函数,必须把所有成员变量拷贝。 void logCall(const std::string& funcName); class Customer{ public: ... Customer(cons

ZLX的博客 208

Effective C++条款12——复制对象时勿忘其每一个成分(构造/析构/赋值运算)

PriorityCustomer的copy构造函数并没有指定实参传给其base class构造函数(也就是说它在它的成员初值列(member initialization list)中没有提到Customer),因此 PriorityCustomer对象的Customer成分会被不带实参之Customer构造函数(即default构造函数——必定有一个否则无法通过编译)初始化。对一个尚未构造好的对象赋值,就像在一个尚未初始化的对象身上做“只对已初始化对象才有意义”的事一样。,我称它们为copying函数。

StudyWinter的博客 315

读书笔记《Effective c++》 条款12 复制对象时勿忘其每一个成分

名词:   copying函数 = 拷贝构造函数 + 赋值操作符 重点是:当你自己要编写一个copying函数时,请确保:   a.复制所有local成员变量   b.调用所有base class内的适当的copying函数。(拷贝构造函数是在初始化列表调用base class的函数,赋值操作符是在函数体调用Base::operator=(rhs)) 另外,这两个co

木头刀 203

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

Core List 1.  拷贝构造函数和赋值构造函数 (1) 拷贝构造函数 (2) 赋值

445

effective c++:条款11:在operator=中处理自我赋值;条款12:复制对象时勿忘其每一个成分

1.何为自我赋值 会调用operator=,如果自己没写,编译器生成默认的。 上述代码在进行自我赋值的时候,先delete掉了原来的,然后new的时候肯定失败,因为原来的被delete掉了。 可以先进行证同测试,然后再new。不过此时仍然存在异常安全问题,如果new失败了,pb将指向一块被删除的区域。 2.copy and swap 参考链接:Copy-and-swap idiom详解和实现...

princeteng's blogs 185
上一篇: C++ 浅拷贝&深拷贝
下一篇: [Effective C++]条款13:以对象管理资源
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值