首先拷贝构造函数的声明方法:

类名::类名(const 类名&)

1、浅拷贝的实现程序:

#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
class Person
{
public:
//构造函数
Person(const char *name, double hei, double wei,
int age0):height(hei),weight(wei),age(age0){
cout << "Person ctor called .\n";
pName = new char[strlen(name) + 1];
strcpy(pName, name);
}
//析构函数
~Person(){
cout << "deleting pName";
delete[] pName; }
//类Person的拷贝构造函数
Person(const Person &person){
cout << "Person copy ctor called";
pName = person.pName;
height = person.height;
weight = person.weight;
age = person.age;
}
private:
char *pName;
double height;
double weight;
int age;
}; int main()
{
Person p1("Leekin",175,185,25);
Person p2(p1);
return 0;
}

  首先这个程序在VS2013上面编译不通过;是因为浅拷贝存在风险:非法操作内存,究其原因是因为“拷贝不充分”导致堆中的某一块内存被不同对象的指针属性同时指向,该内存不可避免的被释放多次,这是不应许。第一次被释放的空间已经属于操作系统,当在一次释放时那一片空间已经不属于程序了。

以下是浅拷贝的内存模型:

2、深拷贝可以避免由于浅拷贝带来的问题,即让拷贝函数做好充分的拷贝,程序如下:

#include "stdafx.h"
#include <iostream>
using namespace std;
class Person
{
public:
//构造函数
Person(const char *name, double hei, double wei,
int age0):height(hei),weight(wei),age(age0){
cout << "Person ctor called .\n";
pName = new char[strlen(name) + 1];
strcpy(pName, name);
}
//析构函数
~Person(){
cout << "deleting pName";
delete[] pName; }
//类Person的拷贝构造函数
Person(const Person &person){
cout << "Person copy ctor called";
pName = person.pName;
height = person.height;
weight = person.weight;
age = person.age;
//深拷贝:重新申请一块内存
pName = new char[strlen(person.pName) + 1];
strcpy(pName, person.pName);
}
private:
char *pName;
double height;
double weight;
int age;
}; int main()
{
Person p1("Leekin",17.5,18.5,25);
Person p2(p1);
return 0;
}

  深拷贝的内存模型:

C++关于构造函数的深拷贝与浅拷贝的更多相关文章

  1. C++拷贝构造函数(深拷贝,浅拷贝)

    对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #i ...

  2. C++之拷贝构造函数、深拷贝、浅拷贝

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  3. C++拷贝构造函数(深拷贝,浅拷贝)

    http://www.cnblogs.com/BlueTzar/articles/1223313.html C++拷贝构造函数(深拷贝,浅拷贝) 对于普通类型的对象来说,它们之间的复制是很简单的,例如 ...

  4. C++拷贝构造函数(深拷贝与浅拷贝)

    转自http://blog.csdn.net/lwbeyond/article/details/6202256/ 一. 什么是拷贝构造函数 对于普通类型的对象来说,它们之间的复制是很简单的,例如:in ...

  5. c++拷贝构造函数,深拷贝,浅拷贝,对象内存

    https://blog.csdn.net/lwbeyond/article/details/6202256 防止默认拷贝发生 通过对对象复制的分析,我们发现对象的复制大多在进行“值传递”时发生,这里 ...

  6. C++拷贝构造函数(深拷贝,浅拷贝)

    http://www.cnblogs.com/BlueTzar/articles/1223313.html 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a;  ...

  7. 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解

     c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...

  8. c++拷贝构造函数(深拷贝,浅拷贝)详解

    一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a;   而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面 ...

  9. C++ Primer笔记9_构造函数_拷贝构造(深拷贝与浅拷贝)

    1.构造函数: >构造函数是一个特殊的.与类同名的成员函数,用于给每一个成员设置适当的初始值. >构造函数不能有返回值,函数名与类名同样. >缺省构造函数时,系统将自己主动调用该缺省 ...

随机推荐

  1. Linux 操作系统位数(32or64)识别

    Linux 操作系统位数识别: LINUX 32位操作系统:Linux x86   i586  i386  i686 i... LINUX 64位操作系统:Linux x64x86_64  X64 . ...

  2. BootStrap-table 客户端分页和服务端分页的区别

    当服务器没有对数据进行分页时,前端页面设计又要求进行分页,要分开来设置. 服务端分页: responseHandler: function(data){ return data.response; } ...

  3. GWT中实现跳转及不同entrypoint怎么互相访问

    怎么跳转? 跳转这个概念这里指的是从一个web页面跳转到另一个web页面,如果我们使用gwt来开发web,很自然的我们会想到怎么从一个gwt做的页面跳转到另一个gwt做的页面. 但从网上的gwt例子来 ...

  4. visual studio 2015 企业版 序列号及官方下载地址

    VisualStudio 2015 正式版已经可以通过官方下载了. Visual Studio 是一套基于组件的软件开发工具和其他技术,可用于构建功能强大.性能出众的应用程序.Visual Studi ...

  5. Entity Framework CodeFirst------使用CodeFirst方式建立数据库连接(一)

    本文分步演练介绍通过 Code First 开发建立新数据库.这个方案包括建立不存在的数据库(Code First 创建)或者空数据库(Code First 向它添加新表).借助 Code First ...

  6. WPF MediaElement.Position属性

    Position 属性定义:获取或设置媒体播放时间的当前进度位置. // // 摘要: // 通过媒体播放时获取或设置进度的当前位置. // // 返回结果: // 媒体时自以来的.默认值为 00:0 ...

  7. CentOS 6.5 64位,调整分区大小

    调整硬盘分区大小 想增加root空间,减少home空间. 1.查看硬盘使用情况. [root@npm ~]# df -h Filesystem Size Used Avail Use% Mounted ...

  8. Gridview分頁保存選項

    #region //'Revision: 1.00 Created Date: 2013/08/02 Created ID: Una [#1300071]增加多選框 /// <summary&g ...

  9. maven项目下tomcat直接启动不了(LifecycleException)。报错如下截图

    经查,tomcat项目下的lib中没有jar包,发布的时候没有将jar包发布上去.这个问题在我的博客中以前遇到过.如何将maven的jar发布到项目中,我的博客里面有记载

  10. Fluent NHibernate之旅

    Fluent NHibernate 之旅 导航篇: [原创]Fluent NHibernate之旅开篇: [原创]Fluent NHibernate之旅二--Entity Mapping: [原创]F ...