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

C++的拷贝构造,拷贝复制和析构

  • String class

#ifndef __MYSTRING__
#define __MYSTRING__class String
{... ...
};String::function(...)...
Global-function#endif
{//构造函数String s1();String s2("hello");String s3(s1);//构造一个String类型的变量,以s1为初值-->拷贝构造cout << s3 << endl;s3 = s2;//将s2赋值给s3,拷贝赋值cout << s3 <<endl;
}

之前的Complex类没有写拷贝构造和拷贝赋值函数,编译器会加上默认的。
要不要重写拷贝构造和拷贝赋值函数,就要看默认的那一套够不够用。
如果是带有指针的类,用默认的那一套,会有很大的问题。

  • Big Three,三个特殊的函数

class String
{
public:String(const char* cstr = 0);String(const String& str);//拷贝构造函数String& operator=(const String& str);//拷贝赋值函数(操作符重载)~String();//析构函数char* get_c_str() const {return m_data;};
private:char* m_data;
};
  • ctor和dtor(构造函数和析构函数)

inline
String::String(const char* cstr = 0)
{if (cstr) {m_data = new char[strlen(cstr) + 1];strcpy(m_data, cstr);} else {m_data = new char[1];*m_data = '\0';}
}
inline
String::~String()
{delete[] m_data;
}
{String s1();String s2("hello");String* p = new String("hello");delete p;
}
  • class with pointer members必须有copy ctor和copy op=

使用默认的拷贝构造(default copy ctor)或拷贝赋值(default op=)就会造成内存泄漏。

  • copy ctor(拷贝构造函数)

深拷贝

inline
String::String(const String& str)
{m_data = new char[strlen(str.m_data) + 1];//直接取另一个object的private data//兄弟之间互为friend-->相同class的各个objects互为friends(友元)strcpy(m_data, str.m_data);
}
{String s1("hello");String s2(s1);
//String s2 = s1;
}
  • copy assignment operator(拷贝赋值函数)

inline String&
String::operator=(const String& str)
{if(this == &str)//检测自我赋值(self assignment)return *this;delete [] m_data;m_data = new char[strlen(str.m_data) + 1];strcpy(m_data, str.m_data);return *this;
}
{String s1("hello");String s2(s1);s2 = s1;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • LLM应用实战: 产业治理多标签分类
  • C语言函数详解(上)【库函数】
  • 十要素超声波气象传感器
  • 「数组」希尔排序 / 区间增量优化(C++)
  • SpringBoot 整合 Excel 轻松实现数据自由导入导出
  • Browserless 网页抓取:Playwright 中的 NodeJS
  • 第2章 C语言基础知识
  • Windows C++控制台菜单库开发与源码展示
  • Java 调整字符串,验证码生成
  • Qt第十七章 多线程
  • ElfBoard技术贴|如何在ELF 1开发板上搭建流媒体服务器
  • 高性能web服务器nginx
  • Mac文件需要分卷压缩怎么办 Mac上怎么解压分卷压缩的文件
  • 二、什么是Vue中的响应式?Vue的响应式原理
  • Linux驱动学习之点灯(四,linux2.6)
  • Centos6.8 使用rpm安装mysql5.7
  • ESLint简单操作
  • HashMap ConcurrentHashMap
  • mysql innodb 索引使用指南
  • PHP CLI应用的调试原理
  • PHP那些事儿
  • SQLServer插入数据
  • WePY 在小程序性能调优上做出的探究
  • 阿里研究院入选中国企业智库系统影响力榜
  • 聊聊hikari连接池的leakDetectionThreshold
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何在 Tornado 中实现 Middleware
  • 深度学习中的信息论知识详解
  • 新书推荐|Windows黑客编程技术详解
  • 一文看透浏览器架构
  • 异常机制详解
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • Prometheus VS InfluxDB
  • 带你开发类似Pokemon Go的AR游戏
  • # C++之functional库用法整理
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #pragma once
  • #QT(一种朴素的计算器实现方法)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #图像处理
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (3) cmake编译多个cpp文件
  • (C#)获取字符编码的类
  • (day18) leetcode 204.计数质数
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (笔记)M1使用hombrew安装qemu
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二十三)Flask之高频面试点
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (五)IO流之ByteArrayInput/OutputStream