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

MATPOWER下载安装教程

将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2016b\bin目录下。原来的窗口中多了很多文件路径,点击【保存】,再点击【关闭】选择所要添加的MATPOWER文件夹,点击【选择文件夹】二、将MATPOWER放在bin目录下。找到菜单栏的【设置路径】点击【添加并包含子文件】一、从官网下载后解压。

weixin_47365903的博客 2万+

基于STM32L4XX、HAL库的 TMC2660C-PA 驱动程序设计

/ 默认灵敏度和电流。// 20/31最大电流。

zhusl6688的博客 386

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

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

倔强的_Yang的专栏 1064

基于 YOLOv26 的电路焊点虚焊检测系统:AI 质检实战

本文介绍了一种基于YOLOv26的电路焊点虚焊检测系统,利用深度学习技术实现自动化质检。系统能识别虚焊、桥接、少锡等8种常见焊点缺陷,具有高精度、实时性和强鲁棒性等特点。文章详细阐述了系统架构,包括数据采集、预处理、YOLOv26检测模型和后处理模块,并提供了代码实现的关键部分,如数据预处理增强和模型训练配置。该系统可显著提高电子制造业的质检效率和准确性。

一键难忘的博客 697

constructor copy constructor initialization and assignment operator

记录了initialization和assignment的区别;

zirconsdu的专栏 2753

【Dumper-7】入门指南 - 带你领略不一样的UE世界

摘要: Dumper-7是一款用于分析UE4/UE5游戏的逆向工具,可自动生成游戏内部结构的C++ SDK。支持Visual Studio、CMake和Xmake三种构建方式,通过DLL注入目标游戏后,自动识别引擎结构并输出C++ SDK文件(默认保存在C:\Dumper-7目录)。该工具适用于游戏Mod开发、安全研究和机制分析,提供完整的类层次映射、属性/函数识别功能。使用时需注意x64平台配置,生成SDK后可集成到自定义DLL项目中,通过示例代码展示如何查找游戏对象、访问世界状态和调用引擎函数。

kinghzking的专栏 439

STM32 cubeMX配置串口重定向

这篇文章主要讲解什么是串口重定向,为什么要串口串口重定向。使用printf函数和上位机通信是非常的方便的。希望大家都能够掌握。

m0_49476241的博客 4573

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

PyTorch实战(19)——变分自编码器(Variational Autoencoder,VAE)

变分自编码器 (Variational Autoencoder, VAE) 是一种结合了自编码器和概率建模的生成模型,通过编码器将输入数据映射到潜在空间中的概率分布,并通过解码器将从潜在空间采样得到的潜在变量映射回原始数据空间,实现了数据的生成和特征学习。本节中,将介绍变分自编码器的基本概念,并使用 PyTorch 实现变分自编码器生成新图像。

盼小辉丶的博客 2934

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

基于Cesium实现,动态水面+大坝排水动画

一、绘制面状水域,使用水波纹理,进行渲染,水体透明,可以看到底色。三、使用粒子系统,将喷泉改变方向,加上重力设置,实现排水动画。二、绘制线状三维体,用作模拟大坝拦截效果。四、最后,模拟水位上升,进行淹没分析,

一醉千秋的专栏 1421

【C语言】初识C语言(上篇)

初识C语言第一部分

StackFrame 4032

我的问题

什么是 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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

实现std::string

Pan_Chengyuan的博客 401

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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、付费专栏及课程。

余额充值