从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类
一、深拷贝与浅拷贝
说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝;如果只是分配指针本身的内存,那就是浅拷贝。浅拷贝造成的问题是有两个指针指向同块内存,delete 其中一个指针,那么剩下的指针将成为野指针。编译器合成的默认拷贝构造函数和赋值运算符是浅拷贝的,如果只是普通成员的赋值,浅拷贝也是可以的。
|   1  2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 
       #ifndef _STRING_H_ #define _STRING_H_ class String void Display(); private: char *str_; #endif  | 
| 1 | 
       #include  "String.h" //#include <string.h> #include <cstring> #include <iostream> using namespace std; String::String( String::~String() String::String( String &String:: delete[] str_; char *String::AllocAndCpy( void String::Display() | 
| 1 | 
       #include  "String.h" int main( String s3; | 
上面程序中String 类有一个char* str_ 成员,故实现了深拷贝,这样不会造成内存被释放两次的错误,或者修改指针指向的内存会影响另一个对象的错误。此外,如果我们想让对象是独一无二的,需要禁止拷贝,只需要将拷贝构造函数和等号运算符声明为私有,并且不提供它们的实现。
二、空类
空类默认产生的成员:
class Empty {};
 Empty(); // 默认构造函数
 Empty( const Empty& );// 默认拷贝构造函数
 ~Empty(); // 默认析构函数
 Empty& operator=( const Empty& );  // 默认赋值运算符
 Empty* operator&();              // 取址运算符
 const Empty* operator&() const;   // 取址运算符 const
| 1 | 
       #include <iostream> using namespace std; class Empty const Empty * int main( const Empty e2; cout <<  return  | 
单步调试一下,可以看到分别调用了两个取地址运算符函数,而且空类的大小为1个字节。
从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类的更多相关文章
- 从零开始学C++之构造函数与析构函数(一):构造函数、析构函数、赋值与初始化、explicit关键字
		一.构造函数.默认构造函数 (1).构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构 ... 
- 从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数
		一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一).对象成员及其初始化 C++ Code 1 2 3 4 5 6 7 8 9 1 ... 
- C++基础-4-封装(构造函数与析构函数,深拷贝与浅拷贝,静态成员,this,友元,const修饰成员函数)
		4. 封装 4.1.1 封装的意义 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 con ... 
- 从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
		在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符. []运算符重载 +运算符重载 +=运算符重载 <<运算符重载 >>运算符重 ... 
- 从零开始学 Web 之 JS 高级(三)apply与call,bind,闭包和沙箱
		大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ... 
- 从零开始学 Web 之 移动Web(三)Zepto
		大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ... 
- 从零开始学 Web 之 Vue.js(三)Vue实例的生命周期
		大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ... 
- C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)
		1.构造函数: >构造函数是一个特殊的.与类同名的成员函数,用于给每一个成员设置适当的初始值. >构造函数不能有返回值,函数名与类名同样. >缺省构造函数时,系统将自己主动调用该缺省 ... 
- 从零开始学安全(四十四)●TCP三次握手四次挥手
		wireshark:Beyond Compare是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与 ... 
随机推荐
- ajax 请求数据
			<!doctype html> <html> <head> <meta charset="utf-8"> <title> ... 
- mysql基础之存储引擎
			原文:mysql基础之存储引擎 数据库对同样的数据,有着不同的存储方式和管理方式,在mysql中,称为存储引擎 常用的表的引擎 Myisam ,批量插入速度快, 不支持事务,锁表 Innodb, 批量 ... 
- Dev的GridView中如何自动生成行号
			这里提供一个方法,使用简单,只需将GridView传入,即可自动生成行号 public static void SetRowNumberIndicator(GridView gridView) { g ... 
- Run QTP script wiht host in HPQC
- SpringMVC全注解
			SpringMVC全注解不是你们那么玩的 前言:忙了段时间,忙得要死要活,累了一段时间,累得死去活来. 偶尔看到很多零注解配置SpringMVC,其实没有根本的零注解. 1)工程图一张: web.xm ... 
- Nginx反向代理实现Tomcat多个应用80端口访问
			应用背景 一般我们在开发时,一个工程里会有多个Web应用,比如一个前台一个后台,那我们就需要配置2个Tomcat服务器,比如一个是http://localhost:8080,一个是http://loc ... 
- 算法打基础——顺序统计(找第k小数)
			这次主要是讲如何在线性时间下找n个元素的未排序序列中第k小的数.当然如果\(k=1 or k=n\),即找最大最小 数,线性时间内遍历即可完成,当拓展到一般,如中位数时,相关算法就值得研究了.这里还要 ... 
- [转]How to create an anonymous IDA PRO database (.IDB)
			Source: http://www.0xebfe.net/blog/2013/01/13/how-to-create-an-anonymous-ida-pro-database-dot-idb/ P ... 
- 对类sizeof的时候
			sizeof一个类的时候,都什么会被计算?静态成员会被计算进来么?如果这是一个子类,它的父类成员会被计算么? #include<stdio.h> #include<string.h& ... 
- Nginx 配置基于域名的虚拟
			编辑配置文件 vi /etc/nginx/nginx.conf user www www; worker_processes 2; error_log logs/error.log not ... 
