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

LK32T102 单片机 操作GPIO实现流水灯(1) 前言: LK32T10232(32位)单片机是一款专为电机控制器和数字电源开发的高性能 MCU。采Cortex-M0 内核,最高工作频率可达 72Mhz,ADC 采样速率 达 1Msps。同时具备协处理器单元可满足各种乘法、除法、移位以及各种 复杂函数运算。 LK32T102(32位)支持单电源供电,且内嵌高精度高速及低速振荡器,以及具备 多种低功耗工作模式。同时,集成了多路增强型 PWM,多通道模拟比较 器和高速运算放大器,可满足多种电机及功率控制应用,并简化系统成本。... 阅读详情

在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;
}

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

Unity开发HoloLens应用:从打包到部署的完整指南 本文为Unity开发者提供了将应用部署到HoloLens设备的完整实战指南。详细讲解了从环境准备、Unity项目配置、生成Visual Studio工程,到最终构建APPX安装包并通过设备门户或Visual Studio进行部署的全流程,帮助开发者高效完成混合现实应用的打包与安装。 阅读详情

相关推荐

五段式S型算法笔记

又因为有 v-v0= 0.5jt通式: 所以有 vm-v0= 0.5jtm 所以有4vm-4v0= 2jtm。算法1: v=2vm-v0-0.5*jt+2jt*tm-2jtm*tm。加加速度j 自己设置 已知,vmax自己设置已知;所以有4vm-4v0= 2jtm带入算法1。

qq_36658033的博客 681

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

Effective_C++_12

君鼎的博客 620

基于FME—三调篇—尖锐角及小缝隙处理

1 问题分析: 该功能实现在FME较为简单,相对ARCGIS模型构建器以及ARCGIS ENGINE,FME更适合无代码基础的人群。在三调内业数据处理要求中,尖锐角是不允许存在的。本文基于FME实现了对尖锐角的自动查询与消除以及自动处理在消除尖锐角过程中产生的缝隙,并进行了拓扑检查,实现自动化批量处理尖锐角的功能,提高工作效率。 2 总体思路: 2.1 实现功能分析: 1.找出小于指定角度的尖锐角...

qq_33315579的博客 9181

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

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

HakunaMatata的博客 235

从零到一:YT8512C PHY芯片在STM32F407上的LWIP移植实战与避坑指南

本文详细介绍了YT8512C PHY芯片在STM32F407平台上基于LWIP协议栈的移植实战,涵盖硬件连接、CubeMX配置、寄存器定制和调试技巧。重点解析了与主流PHY芯片的差异,提供了完整的避坑指南和优化建议,帮助开发者快速实现稳定可靠的嵌入式网络连接。

uber9的博客 538

智慧杯 考试必备

2019.4. 强密码 描述 我们称一个密码是强密码,当且仅当它满足以下所有条件: 由 8 − 16 个字符组成 至少包含一个大写字母 (A-Z) 至少包含一个小写字母 (a-z) 至少包含一个数字 (0-9) 至少包含一个特殊符号 (! @ #$ % & * _ +) 娇娇发现她现在的密码好像不是强密码,请你帮她计算一下最少添加几个 字符可以变成强密码? 输入 输入仅一行,一个字符串,表示娇娇当前的密码 输出 输出一个数表示答案 如果不需要添加任何字符就已.

Fairy1208的博客 2861

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

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

weixin_42255569的博客 363

RH850_U2A系列HSM安全核开启但是固件未烧录导致无法启动也无法再烧入固件废板问题分析解决

hsm核导致的安全锁死补救方案

u011941262的博客 1734

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

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

tus00000的博客 923

数学建模传染病模型_【数学建模】之传染病模型

点击【拇指笔记】,关注我的公众号。SE模型缺点:没有考虑接触到的人中还有一部分病人,所以所有人并不会全部被感染。建立模型:已感染人数(病人)每个病人每天有效接触(足以使人致病)人数为根据(1)(2)可以建立模型:等式两边同时除以\Delta t由导数定义有同时,取\Delta t = 1天由(1)(5)两式可得最终的模型:Logistic模型缺点:区分已感染者(病人)和未感染者(健康人)...

weixin_39590453的博客 2227

《QGIS快速入门与应用基础》108:CGCS2000对应的投影坐标系

本文详细解析了CGCS2000地理坐标系对应的各类投影坐标系,包括高斯-克吕格3°带/6°带、UTM、地方独立投影和Web墨卡托投影。文章系统阐述了各投影类型的分带规则、参数设置、精度特性及适用场景,并提供了EPSG编码对照表和QGIS操作指南。通过"基准+投影"的绑定机制,这些投影坐标系实现了平面坐标与经纬度的精准转换,满足从大比例尺工程测量到Web地图服务等不同应用需求。内容涵盖投影原理、坐标格式、变形控制等关键技术要点,为GIS开发者和测绘人员提供了实用的参考信息。

LuckyHanMo的博客 541

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

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

weixin_44980842的博客 442

《C++等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《C++等级认证CCF-GESP真题解析》🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》C++编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,欢迎订阅!

人生就是一个不断学习的过程 6287

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

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

沐怡旸的专栏 943

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

weixin_34292924的博客 128

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

读书笔记《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、付费专栏及课程。

余额充值