拷贝构造函数(深拷贝vs浅拷贝)
拷贝构造函数(深拷贝vs浅拷贝)
类对象之间的初始化是由类的拷贝构造函数完毕的。它是一种特殊的构造函数,它的作用是用一个已知的对象来初始化还有一个对象。假设在类中没有显式地声明一个拷贝构造函数。那么,编译器将会自己主动生成一个默认的拷贝构造函数,该构造函数完毕对象之间的位拷贝。位拷贝又称浅拷贝。
一、拷贝构造函数定义格式
类名::拷贝构造函数名(类名& 引用名)
比如:
Tdate ::Tdate(Tdate & d); //形參是一个对象的引用
CString( const CString & stringSrc ); //形參是一个const的对象引用
二、通常在下述三种情况下。须要用拷贝初始化构造函数:
1)明白表示由一个对象初始化还有一个对象时;如Cdate day3(d1);
2)当对象作为函数实參传递给函数形參时;如fun(Cdate day);
3)当对象作为函数的返回值,创建一个暂时对象时。
浅拷贝和深拷贝
浅拷贝仅仅对对象数据成员进行简单的赋值复制操作,在某些状况下,类内成员变量须要动态开辟堆内存,假设实行位拷贝,也就是把对象里的值全然复制给还有一个对象,如A=B。这时。假设B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现执行错误。
深拷贝和浅拷贝能够简单理解为:假设一个类拥有资源。当这个类的对象发生复制过程的时候。资源又一次分配,这个过程就是深拷贝。反之,没有又一次分配资源。就是浅拷贝。
以下举个深拷贝的样例。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
class CClass
{
public:
CClass (char *cName="",int snum=0);
~CClass()
{cout<<"析构班级:"<<pname<<endl;
delete pname;
}
void Print();
private:
char *pname;
int num;
}; CClass::CClass(char *cName,int snum)
{
int length = strlen(cName);
pname = new char[length+1];
if (pname!=0) //pname!=NULL
strcpy(pname,cName);
num=snum;
cout<<"创建班级:"<<pname<<endl;
} void CClass::Print()
{
cout<<pname<<"班的人数为:"<<num<<endl;
} int _tmain(int argc, _TCHAR* argv[])
{
CClass c1("计算机061班,56);
CClass c2 (c1);
c1.Print();
c2.Print();
//system("pause");
return 0;
}
c1、c2内存分配情况(深拷贝)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGF1dF96amI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
CClass(CClass &p); //自己定义拷贝构造函数声明
//加入自己定义拷贝构造函数
CClass::CClass(CClass &p)
{
pname = new char[strlen(p.pname )+1];
if (pname!=0)
strcpy(pname,p.pname);
num=p.num ;
cout<<"创建班级的拷贝:"<<pname<<endl;
}
执行结果:
创建班级:计算机061班
创建班级的拷贝:计算机061班
计算机061班班的人数为:56
计算机061班班的人数为:56
析构班级:计算机061班
析构班级:计算机061班
拷贝构造函数(深拷贝vs浅拷贝)的更多相关文章
- 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解
c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...
- 【C++】拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面看一个类对 ...
- C++拷贝构造函数(深拷贝,浅拷贝)
http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; ...
- c++拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面 ...
- c++拷贝构造函数(深拷贝、浅拷贝)——转
拷贝构造函数: 拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类的一个引用变量,该参数是const类型,不可变的.例如:类A的拷贝构造函数的形式为A(A& ...
- C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)
1.构造函数: >构造函数是一个特殊的.与类同名的成员函数,用于给每一个成员设置适当的初始值. >构造函数不能有返回值,函数名与类名同样. >缺省构造函数时,系统将自己主动调用该缺省 ...
- C++拷贝构造函数(深拷贝&浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. ...
- 借jQuery对象拷贝学习深拷贝与浅拷贝
jQuery.extend([deep], target, object1, [objectN]) 即用一个或多个其他对象来扩展一个对象,返回被扩展的对象. deep:如果设为true,则递归合并. ...
- python的拷贝(深拷贝和浅拷贝)
今天看了几篇关于python拷贝的博文,感觉不太清楚,所以我就自己做实验试一下,特此记录. 拷贝是针对组合对象说的,比如列表,类等,而数字,字符串这样的变量是没有拷贝这一说的. 实现拷贝有: 1.工厂 ...
随机推荐
- Linux学习之设置联网,关闭防火墙,关闭selinux
桥接模式,给一台物理机,有自己独立的IP. boot分区,引导分区,系统启动,内核文件. swap分区,内存扩展分区.1.5或2倍.内存不够的时候,会写入其中.正常给8G或者16G就够了.不需要非要1 ...
- net快速写入/读取大量数据Postgresql
Postgresql快速写入/读取大量数据 http://www.cnblogs.com/podolski/p/7152144.html 环境及测试 使用.net驱动npgsql连接post数据库.配 ...
- Node.js:事件循环
ylbtech-Node.js:事件循环 1.返回顶部 1. Node.js 事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 ...
- struts的工作流程
- 一个请求过来,走前端控制器StrutsPrepareAndExecuteFilter -前端控制器是一个过滤器,过滤器中的核心方法是doFilter(),doFilter方法中首先处 ...
- libhiredis.so.0.13 => not found 缺少
wget https://github.com/redis/hiredis/archive/v0.13.3.tar.gz tar -xzvf v0.13.3.tar.gz cd hiredis- ma ...
- 将python的程序包装成windows下的service
使用python编写的脚本应用程序,在运行的时候需要有python的运行环境,但是我们肯定是希望整个python程序能够像应用程序一样打包生成一个包括其运行环境的exe文件包,这是第一步,但是要想使用 ...
- Codeforces Round #450
Find Extra One Solution Position in Fraction Solution Remove Extra One f[i]表示删掉i能增加的record数目 从左到右处理, ...
- poj1111 Image Perimeters 广搜
题目大意: 输入一个矩阵,再输入其中一个“X”的位置(从1开始).从该位置向八个方向扩展,如果是“X”就可以并在一起.问最后得到的模块的周长是多少. 解题思路: 按照广搜的思路来做.用一个二维的数组标 ...
- Verilog之$sreadmemb
1 Memories Memories file format is shown below, the address is specified as @ <address> in he ...
- Mysql优化-为表字段添加索引
1.添加PRIMARY KEY(主键索引): ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) : ALTE ...