【C++基础 02】深拷贝和浅拷贝
我的主题是。每天积累一点点。
===========================================
在类定义中,假设没有提供自己的拷贝构造函数,则C++提供一个默认拷贝构造函数。
C++提供的默认拷贝构造函数的工作方法是:完毕一个成员一个成员的拷贝。假设成员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数。须要注意的是。默认拷贝构造函数不会处理静态成员变量。
简单的自己定义拷贝构造函数:
class Student{
public:
//拷贝构造函数
Student(Student& s)
{
a = s.a;
}
protected:
int a;
};
如上,我们拷贝的策略是一个一个成员的拷贝,可是假设一个类拥有资源,当其构造函数分配了一个资源(如堆内存),而拷贝构造函数没有去分配该资源。那么两个对象都拥有同一个资源,这称为浅拷贝。
浅拷贝的一个问题是,当对象析构的时候,该资源将经历两次资源返还。比方以下这样子:
class Person
{
public:
Person(char* pN)
{
cout<<"Constructing"<<pN<<endl;
pName = new char[strlen(pN) + 1];
if(pName != 0)
{
strcpy(pName,pN);
}
}
~Person()
{
cout<<"Destructing"<<pName<<endl;
delete pName;
pName = NULL;
}
protected:
char* pName;
}; void main()
{
Person p1("fzll");
Person p2 = p1; //调用默认拷贝函数
} //输出信息
Constructing fzll
Destructing fzll
Destructing
Null pointer assignment
能够看到,第二次释放资源的时候,出错了。
由于默认拷贝构造函数并没有分配新的资源。
所以我们须要自己定义拷贝构造函数。并分配资源,使拷贝和被拷贝的对象指向不同的资源,这就是深拷贝的概念。C++提供的默认拷贝构造函数就是浅拷贝。
详细例如以下:
class Person
{
public:
Person(char* pN)
{
cout<<"Constructing"<<pN<<endl;
pName = new char[strlen(pN) + 1];
if(pName != 0)
{
strcpy(pName,pN);
}
}
Person(Person& p)
{
cout<<"CopyPerson "<<p.pName<<endl;
pName = new char[strlen(p.pName) + 1];
if(pName != 0)
{
strcpy(pName,p.pName);
} }
~Person()
{
cout<<"Destructing"<<pName<<endl;
delete pName;
pName = NULL;
}
protected:
char* pName;
}; void main()
{
Person p1("fzll");
Person p2 = p1; //调用自己定义拷贝函数
} //输出信息
Constructing fzll
CopyPerson fzll
Destructing fzll
Destructing fzll
堆内存是最经常使用的须要构造拷贝的资源,还有其他资源。比方文件的打开,设备的占有(如打印机)服务业须要深拷贝。
一个非常好的经验是:假设你的类须要析构函数来释放资源。那么它也须要一个拷贝构造函数(深拷贝的方式)。
==============================================================
转载请注明出处:http://blog.csdn.net/shun_fzll/article/details/37774495
【C++基础 02】深拷贝和浅拷贝的更多相关文章
- Java基础(十三)--深拷贝和浅拷贝
在上篇文章:Java基础(十二)--clone()方法,我们简单介绍了clone()的使用 clone()对于基本数据类型的拷贝是完全没问题的,但是如果是引用数据类型呢? @Data @NoArgsC ...
- JavaScript基础之--- 深拷贝与浅拷贝
理解深拷贝和浅拷贝之前,先来看一下JavaScript的数据类型. 1.基本类型和引用类型 //案例1 var num1 = 1, num2 = num1; console.log(num1) con ...
- .NET基础知识之八——深拷贝,浅拷贝
目录 1.概念 2.使用赋值符号"=" 3.浅复制 4.深复制 5.问题一:如果类里面嵌套有多个类,然后嵌套类里面又嵌套类,那么像上面实现深拷贝的方法还能用吗? 6.问题二:实现深 ...
- Python基础-字符串、集合类型、判断、深拷贝与浅拷贝、文件读写
字符串 1.定义三个变量: 2.交换两个变量值 1)引入第三个变量: 2)Python引入第三方变量: 3)不引入第三方变量: 3. isalpha 是否是汉字或字母 4.Isalnum 是否是汉字 ...
- C++基础-4-封装(构造函数与析构函数,深拷贝与浅拷贝,静态成员,this,友元,const修饰成员函数)
4. 封装 4.1.1 封装的意义 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 con ...
- JavaScript中面向对象的的深拷贝和浅拷贝
理解深拷贝和浅拷贝之前需要弄懂一些基础概念,内存中存储的变量类型分为值类型和引用类型. 1.值类型赋值的存储特点, 将变量内的数据全部拷贝一份, 存储给新的变量. 例如:var num = 123 : ...
- 也来玩玩 javascript对象深拷贝,浅拷贝
经常看到讨论c#深拷贝,浅拷贝的博客,最近js写的比较多, 所以也来玩玩js的对象拷贝. 下面是维基百科对深浅拷贝的解释: 浅拷贝 One method of copying an object is ...
- 设计模式_11_原型模式(prototype)深拷贝、浅拷贝
设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...
- 浅析C#深拷贝与浅拷贝
1.深拷贝与浅拷贝 拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...
- 浅析C#深拷贝与浅拷贝(转)
1.深拷贝与浅拷贝 拷贝即是通常所说的复制(Copy)或克隆(Clone),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...
随机推荐
- 获取Java接口的所有实现类
获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...
- sysUpload.vue上传组件 的时候 看进度的时候 不要mock 注释掉 // if (process.env.NODE_ENV !== 'production') require('@/mock')
上传组件 的时候 看进度的时候 不要mock 注释掉 // if (process.env.NODE_ENV !== 'production') require('@/mock') <!-- * ...
- [SQL]连续三天有销售额
店铺 销售日期 销售额 A 2017-10-11 300 A 2017-10-12 200 B 2017-10-11 400 B 2017-10-12 200 A 2017-10-13 100 A 2 ...
- PHP24 自定义分页类
分页类的定义 <?php /** * Class MyPage 分页类 * @package core */ class MyPage { private $totalCount; //数据表中 ...
- 一个关于vue+mysql+express的全栈项目(三)------ 登录注册功能的实现(已经密码安全的设计)
本系列文章,主要是一个前端的视角来实现一些后端的功能,所以不会讲太多的前端东西,主要是分享做这个项目学到的一些东西,,,,, 好了闲话不多说,我们开始搭建后端服务,这里我们采用node的express ...
- JS 获取字符串中的url并返回其下标索引
//获取字符串中的url极其下标索引 function getHttpUrlArray(s) { var s1 = s.match(/http.*/); if(s1 == null) { return ...
- 69. JPA实体Bean的生命周期【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 在使用JPA的时候,如果对bean的生命周期不了解的话,难免会碰到一些问题,比如:InvalidDataAccessApiUsageExcepti ...
- CodeForces 21 A+B
Jabber ID 判断邮箱地址格式是否正确..一把心酸泪...跪11+,,看后台才过.. 注 ...
- CodeForces230A
题目大意: 一个打恐龙的游戏,有初始体力s,和恐龙n只,然后输入n只恐龙的体力xi,和击杀它得到的奖励体力yi,只有自身体力大于恐龙体力时才能进行击杀,击杀恐龙的顺序可以不定 这题运用到了贪心的思想, ...
- hdu 4460spfa用map来实现
#include<stdio.h> #include<string.h> #include <iostream> #include <algorithm& ...