copy constructor,destructor 和copy assignment operator

类的三个特殊成员Copy Constructor、Copy-Assignment Operator、Destructor重载与使用 今天看《C++ Primer》的13.1节——Copy, Assign, and Destroy 被这几个玩意儿弄得晕得不行:   ◆   Copy Constructor   ◆   The Copy-Assignment Operator   ◆   Destructor 主要问题集中在:   ◆   我们在什么时候需要自己重写? 阅读详情
转自:http://patmusing.blog.163.com/blog/static/1358349602009113061024796/

#include <iostream>
using namespace std;

class Point
{
public:
         int _x;
         int _y;
 
public:
         Point();
         Point(int, int);
};
 
Point::Point()
{
         _x = 0;
         _y = 0;
}
 
Point::Point(int x, int y)
{
         _x = x;
         _y = y;
}
 
class CA
{
public:
         Point* _point;
 
public:
         CA(const Point*);
         void setPointValues(int, int);
         void printCoordinates();
 
         // 需要增加的拷贝构造函数
         CA(const CA&);
         // 需要增加的析构函数
         virtual ~CA();
         // 需要增加的拷贝赋值函数
         CA& operator = (const CA&);
};
 
CA::CA(const Point* point)
{
         _point = new Point();                   // 发生了动态内存分配!因此不能缺少析构函数。
         _point->_x = point->_x;
         _point->_y = point->_y;
}
 
// 需要增加的拷贝构造函数的实现
CA::CA(const CA& ca)
{
         _point = new Point();
         _point->_x = (ca._point)->_x;
         _point->_y = (ca._point)->_y;
}
 
// 需要增加的析构函数的实现
CA::~CA()
{
         if(!_point) delete _point;
}
 
// 需要增加的拷贝赋值函数的实现
CA& CA::operator = (const CA& ca)
{
         _point = new Point();
         _point->_x = (ca._point)->_x;
         _point->_y = (ca._point)->_y;
 
         return *this;
}
 
void CA::setPointValues(int x, int y)
{
         _point->_x = x;
         _point->_y = y;
}
 
void CA::printCoordinates()
{
         cout << "Coordinates = (" << _point->_x << ", " << _point->_y << ")" << endl;
}
 
int main(void)
{
         Point apoint(1, 2);
         CA ca(&apoint);
         ca.printCoordinates();
 
         CA cb(ca);                                               // 调用拷贝构造函数
         cb.printCoordinates();
 
         cb.setPointValues(12, 12);
         cb.printCoordinates();
         ca.printCoordinates();
 
         CA cc = cb;                                              // 调用拷贝赋值函数
         cc.printCoordinates();
         cc.setPointValues(13, 13);
        
         ca.printCoordinates();
         cb.printCoordinates();
         cc.printCoordinates();
 
         return 0;
}

C++ 的 Rule-of-Three No More C++ 系列带你玩转各种现代 C++ 的重要知识,告诉你凡人也可以接触和拥抱 C++。 C++ 作为一个古老的面向对象编程语言,基本上大部分事情都是围绕着 class 展开。 引: 在介绍 rule-of-three 和 copy-and-swap idiom 之前,我们来回顾一下如何用 C++ 构造一个自定义类。 // Example 1 class Empty {}; E... 阅读详情

相关推荐

C++默认成员函数全解析:三五法则与零法则实战指南

在C++面向对象编程中,特殊成员函数是类设计的核心基础。默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数和移动赋值运算符这六大函数,共同构成了对象的生命周期管理体系。理解这些函数的生成规则与调用时机,是掌握C++对象模型的关键。从概念层面看,编译器会根据三五法则自动生成这些函数,但默认的浅拷贝行为在处理动态内存等资源时存在严重隐患,容易导致程序崩溃或内存泄漏。通过深拷贝与移动语义的技术实现,开发者可以优化资源管理,提升程序性能。在实际工程中,遵循零法则优先使用智能指针和标准容器管理资源,能

bangtuo9862的博客 511

25个C++ API设计错误和避免方法

软件工程,就像建房子一样,包括规划、调研、计划、需求、调查、团队、分工、材料、框架、装饰、人力、资金、周期、后期使用、保养、维护、退出、更新、风险、质量、测试、漏洞、文档、稳定性、性能、品牌等等。 设计一个软件,不是一个人的活。做好一个软件,是一件难事。一步一步,管理好各方面因素,方可完成。 来源于 April 24, 2019//byDeb Haldar//12 Comments Top 25 C++ API design mistakes and how to avoid themht...

islinyoubiao的专栏 2169

C++11核心特性实战:列表初始化与移动语义深度解析

在C++编程中,对象初始化和资源管理是影响代码质量与性能的关键基础。传统初始化语法存在不一致性,而深拷贝带来的性能开销一直是C++的痛点。C++11通过引入统一列表初始化语法,提供了更安全、一致的初始化方式,有效防止了窄化转换错误。同时,其核心的移动语义机制,基于右值引用概念,允许资源所有权的直接转移而非复制,从根本上解决了不必要的深拷贝问题,显著提升了程序运行效率。这一特性是现代C++高性能编程的基石,尤其在容器操作、函数返回值优化等场景下价值巨大。本文聚焦于列表初始化和移动语义这两个C++11最核心的特

weixin_33851177的博客 463

default constructor, copy constructor, copy assignment operator, destructor

constructor: a special member function used to initialize objects. Each constructor should give each data member a well defined initial value. synthesized default constructor: the default constru

头像是我的偶像的专栏 629

Simulink中通过MEX与MinGW实现C/C++结构体变量的高效导入

本文详细介绍了在Simulink中通过MEX工具链与MinGW编译器,高效导入C/C++结构体变量的完整流程。文章从需求背景出发,逐步讲解了MinGW环境配置、.h文件编写规范、核心导入命令Simulink.importExternalCTypes的使用,以及如何在MATLAB Function模块和总线创建器中调用自定义结构体,旨在实现模型与代码的无缝对齐,为后续仿真和代码生成奠定坚实基础。

weixin_29056781的博客 345

深入理解Linux 内核追踪机制

Linux 存在众多 tracing tools,比如 ftrace、perf,他们可用于内核的调试、提高内核的可观测性。众多的工具也意味着繁杂的概念,诸如 tracepoint、trace events、kprobe、eBPF 等,甚至让人搞不清楚他们到底是干什么的。本文尝试理清这些概念。

youzhangjing_的博客 1732

C/C++修炼之道01——复制构造函数(copy constructor)

定义:       只有单个形参,该形参是对本类类型对象的引用(常用const修饰),这样的构造函数成为复制构造函数。 使用方式: (1)显示使用----用一个同类型的对象初始化该对象时; (2)隐式使用----将该类型的对象传递给函数或从函数返回该类型对象时。 三种类型的复制构造函数: *bitwise copy constructor :逐位复制-----默

倔强的_Yang的专栏 1064

望获实时Linux与国产芯片协同:打造LinuxCNC数控机床的全栈国产化方案

本文探讨了如何通过望获实时Linux与飞腾、龙芯等国产芯片的深度协同,为LinuxCNC数控机床打造全栈国产化方案。望获实时Linux通过中断隔离等核心技术,提供亚微秒级确定性响应,解决了传统Linux系统实时性不足的痛点,使LinuxCNC得以稳定驱动高精度机床。该方案实现了从硬件、操作系统到应用软件的全栈自主可控,为工业控制领域提供了高性能、可定制的国产化选择。

weixin_29291069的博客 649

constructor copy constructor initialization and assignment operator

记录了initialization和assignment的区别;

zirconsdu的专栏 2753

自动驾驶仿真(五)—— 基于Carsim、Prescan、Simulink的联合仿真

自动驾驶仿真五——基于Carsim、Prescan、Simulink的联合仿真1. 联合仿真流程2. CarSim联合仿真配置要点3. Prescan联合仿真配置要点4. Carsim、Prescan、Simulink联合仿真结果5. 参考学习的书目教材 博主前面的博文已经介绍了Carsim和Prescan各自与Matlab/Simulink的相关联合仿真应用实例,并且论述过几款软件各自的优势及用法,CarSim适合动力学模型的建立,PreScan适合行车场景的搭建,Simulink适合控制算法的设计及信号

zhudj08的博客 1万+

Grok-1.5+Ollama企业级本地化部署与合规实践指南

本文详细介绍了Grok-1.5+Ollama企业级本地化部署与合规实践指南,重点分析了本地化部署的成本优势和数据主权保障。通过RTX 4090显卡的硬件选型、Ubuntu 22.04系统优化及部署流程中的关键陷阱规避,为企业提供了高效、安全的AI模型部署方案。特别适合金融、医疗等敏感行业。

weixin_29094539的博客 183

C++核心准则​讨论:保持定义复制,移动和析构函数的一致性

Discussion: Define Copy, move, and destroy consistently 讨论:保持定义复制,移动和析构函数的一致性 Reason(原因) ??? Note(注意) If you define a copy constructor, you must also define a copy assignment operator. 如果定义了拷贝构造函数,则还必须定义一个拷贝赋值运算符。 Note(注意) If you define a ...

面向对象思考 791

Qt C++ 卫星数据接收与处理界面

打开 `MainWindow.ui`,你会发现我们完全是在代码中 (`setupUI`) 创建的 UI。* 访问 [QCustomPlot 官网](https://www.qcustomplot.com/) 下载最新版本的 `qcustomplot.h` 和 `qcustomplot.cpp` 文件。* 对于 FFT,可以使用专门的库如 [FFTW](http://www.fftw.org/),或者 Qt 5.15 及以上版本中提供的 `QFFT` 和 `QComplex` 类。

寒寒豆豆软件公司的博客 151

C++-copy constructor、copy-assignment operator、destructor

本文由@呆代待殆原创,转载请注明出处。 对于一个类来说,我们把copy constructor、copy-assignment operator、move constructor、move-assignment operator、destructor统称为copy control。 今天我们先来聊聊其中的copy constructor、copy-assignment operator的...

weixin_30443731的博客 165

【Claude】SSL certificate verification 错误:证书校验失败与自定义 CA 配置

获取并验证企业 CA 证书后,需要配置 Claude Code(Node.js)信任该证书。Claude Code 的 SSL 错误通常源于企业代理:不是 Anthropic 服务器的问题Node.js 使用独立的 CA 存储:操作系统信任了企业 CA 不等于 Node.js 也信任NODE_EXTRA_CA_CERTS 是标准解决方案:指向包含企业 CA 的 PEM 文件绝不使用 NODE_TLS_REJECT_UNAUTHORIZED=0:这等于关闭所有 HTTPS 安全验证证书链完整性很重要。

博客 6818

OpenClaw实战系列06:持久记忆与RAG知识库构建——让AI真正“记住”你

本文介绍了OpenClaw AI助理的持久记忆与RAG知识库构建功能。OpenClaw采用"文件即真理"的独特设计,所有记忆都以Markdown文件形式存储,支持直接编辑和Git版本管理。记忆系统分为三层:长期精炼记忆(MEMORY.md)、日常日志(按日期存储)和归档记忆。文章详细说明了环境配置步骤,包括安装必要组件、创建目录结构、设置API密钥,并提供了OpenClaw主配置文件的完整参数说明。该系统实现了跨会话、跨平台的持久化记忆,使AI助理能真正理解用户需求。

PeterPan的博客 1171

我的问题

什么是 non-trivial default constructor, non-trivial copy constructor, non-trivial assignment operator, non-trivial destructor? 转载于:https://www.cnblogs.com/wanghetao/archive/2011/11/21/2256679.html...

weixin_30439031的博客 63

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

手写实现C++ std::string 类

实现std::string

Pan_Chengyuan的博客 401

android 蓝牙通讯demo

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++继承机制深度解析:从语法到内存布局与设计实践

面向对象编程(OOP)通过封装、继承和多态三大特性构建复杂软件系统。其中,继承机制基于类之间的“is-a”关系,实现了代码复用和层次化建模,是构建可扩展架构的核心技术。其原理涉及派生类对基类成员的访问控制、内存布局的连续分配以及构造析构的顺序保证,这些机制直接影响程序的性能和资源管理。在工程实践中,继承的价值体现在减少代码冗余、提升可维护性,并支持多态行为。应用场景广泛,从GUI框架中的控件层次到游戏开发中的实体系统都依赖继承结构。本文聚焦C++中的继承实现,深入探讨公有、保护、私有三种继承方式的语义差异,

转些好文章,促进分享。 352

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++默认成员函数全解析:从构造到析构,掌握对象生命周期管理

在C++面向对象编程中,类的特殊成员函数是对象生命周期管理的核心机制。这些函数包括构造函数、析构函数、拷贝操作和移动操作,它们共同决定了对象的创建、复制、移动和销毁行为。理解这些函数的原理对于编写高效、安全的C++代码至关重要,特别是在涉及动态内存管理时。编译器会自动生成这些函数的默认版本,但默认实现往往只进行浅层操作,当类管理动态资源(如堆内存)时,浅拷贝会导致严重的资源管理问题,如内存泄漏和双重释放。因此,掌握如何正确实现这些函数,特别是深拷贝和移动语义,是提升代码健壮性和性能的关键。本文通过实际案例深

weixin_33853827的博客 431

C++面向对象编程核心:类与对象、访问限定符与六大默认成员函数详解

面向对象编程(OOP)是一种以类和对象为核心的编程范式,其核心思想是通过封装、继承和多态来组织代码。在C++中,类是实现封装的基本单元,它通过访问限定符(public、private、protected)控制成员的可见性,确保数据的安全性和接口的清晰性。理解类的默认成员函数(构造函数、析构函数、拷贝控制函数等)对于管理资源、避免内存泄漏和提升性能至关重要。这些机制在构建大型软件系统、实现资源管理(如智能指针)和优化临时对象处理等场景中具有极高的技术价值。本文以C++类和对象为切入点,深入探讨了访问限定符的设

weixin_33674976的博客 660

C++构造函数与析构函数详解:从RAII到移动语义的完整生命周期管理

在C++面向对象编程中,构造函数和析构函数是管理对象生命周期的核心机制。构造函数负责对象的初始化,确保对象创建时处于有效状态;析构函数则负责资源清理,防止内存泄漏。其背后的RAII(资源获取即初始化)原则是现代C++资源管理的基石,通过将资源绑定到对象生命周期,实现自动管理。在涉及动态内存、文件句柄等资源时,正确实现深拷贝、移动语义(C++11引入)至关重要。对于多态继承体系,必须使用虚析构函数以确保派生类资源正确释放。理解这些概念有助于编写健壮、高效的C++代码,是掌握智能指针、容器等高级特性的基础。

weixin_30570101的博客 316

3.类与对象-中【由浅入深-C++】

由于c++的类与对象较为繁琐复杂,本文介绍类与对象部分的相关内容。

插花弄玉的博客 1104

转向现代C++——理解特种成员函数的生成机制

这三个函数都与资源管理有关。需要自定义其中一个,几乎意味着另外两个也需要自定义。特种成员函数(Special Member Functions),代码编译运行一切正常,但性能可能下降数个数量级!它们是编译器为类提供的"默认服务"。这是 C++11 最容易踩的坑:移动请求会。拷贝构造函数、拷贝赋值运算符、析构函数。是指 C++ 编译器在特定条件下会。中的任何一个,就应该声明全部三个。用户自定义析构函数抑制移动操作。拷贝操作与移动操作的互斥关系。编译器生成的这些函数都是。的(虚析构函数例外)

2502_93606049的博客 473
上一篇: GetMemory
下一篇: HeapSort 堆排序
Dark_Passion
博客等级 码龄17年 14粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值