【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),对象的拷贝也就是从现有对象复制一个“一模一样”的新对象出来.虽然都是复制对象,但是不同的 复制方法,复制出来的新对象却并 ...
随机推荐
- select2宽度占比100%,导致无法实现浮动效果
- canvas使用自定义字体没有效果
字体样式没有显示主要是因为字体还没有加载完成~ css @font-face { font-family: myFont; src: local('sen.ttf'), url("sen.t ...
- 一套出完被喷爆的noip提高组+的题目
这是一个悲伤的故事. 校内胡测嘛,这当然的重视啦,好好地出完题,看题面不是很难哦,那就用它吧. 结果今天老师考试就用上了(情况不妙) 果然考试过程中就有打喷嚏的冲动. 一道暴力,一道概率DP,一道主席 ...
- [CF] 950A Left-handers, Right-handers and Ambidexters
A. Left-handers, Right-handers and Ambidexters time limit per test1 second memory limit per test256 ...
- 常用字符串匹配算法(brute force, kmp, sunday)
1. 暴力解法 // 暴力求解 int Idx(string S, string T){ // 返回第一个匹配元素的位置,若没有匹配的子串,则返回-1 int S_size = S.length(); ...
- xshell连接Linux(centos6.8)失败的解决方法
注意:本人使用的是Centos6.8版本. Centos7以上版本linux命令会又不一样的地方. 启动xshell终端进行连接服务器:使用命令:ssh + ip地址或是手动使用可视化操作窗口操作, ...
- oracle如何重做日志组
1.查询数据库中的重做日志组 SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STA ...
- logging ,re 模块
一,复习 # random: random() randint() choice() sample() # 序列化:对象需要持久化存储或传送 对象 => 字符串 # json: 用于传输 # - ...
- Mac 10.10 配置apache
配置php 命令行工具:http://blog.csdn.net/evane1890/article/details/38759073 自从系统从OS X Mavericks 10.9升级到OS X ...
- mybatis插件 mybatis插件-------从dao快速定位到mapper的sql语句
步骤一:打开settings,点击plugins 快捷键ctrl+alt+s打开settings 步骤二.点击ClearCase Integration,并点击下面中间的按钮(browse repos ...