#include <iostream>
#include <string>
#include <assert.h>
using namespace std; //声明字符串拷贝函数
char* mystrcpy(char* str1,const char* str2); class CPerson
{
char* m_pName;
public:
CPerson(char* pName)
{
cout<<"普通构造函数"<<endl;
m_pName = new char[strlen(pName)+];
if(m_pName)
{
mystrcpy(m_pName, pName); }
} //拷贝构造函数,只做位模式拷贝,即浅拷贝
// CPerson(CPerson &p)
// {
// m_pName = p.m_pName;
// } //深拷贝 构造函数
CPerson(CPerson &p)
{
cout<<"深拷贝构造函数"<<endl;
m_pName = new char[strlen(p.m_pName)+];
if(m_pName)
{
mystrcpy(m_pName, p.m_pName);
}
}
~CPerson()
{
cout<<"析构函数"<<endl;
delete[] m_pName;
}
}; int main()
{
CPerson p1("Hello");
CPerson p2(p1);
//浅拷贝时,调用浅拷贝构造函数,p1.m_pName和p2.m_pName指针同时指向一个地址
//析构函数调用时,会两次删除m_pName指针,造成错误,
//所以要用深拷贝解决此问题
return ;
}
//mystrcpy的实现
char* mystrcpy(char* str1,const char* str2)
{
char* p = str1;
assert(str1 != NULL && str2 != NULL);
while(*str2)
{
*p = *str2;
p++;
str2++;
}
p = NULL;
return str1;
}

作为初学者,刚开始看时,看视频,然后抄抄代码,懵懵懂懂就过去了,然而再回过头来,温习最初的基础知识,才能深刻领悟其"之所以然".

睡不着,复习一下C++基础中的基础(深拷贝与浅拷贝)的更多相关文章

  1. [.net 面向对象编程基础] (3) 基础中的基础——数据类型

    [.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...

  2. [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换

    [.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...

  3. [.net 面向对象编程基础] (5) 基础中的基础——变量和常量

    [.net面向对象编程基础]  (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...

  4. [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式

    [.net 面向对象编程基础] (6) 基础中的基础——运算符和表达式 说起C#运算符和表达式,小伙伴们肯定以为很简单,其实要用好表达式,不是一件容易的事.一个好的表达式可以让你做事半功倍的效果,比如 ...

  5. [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句

    [.net 面向对象编程基础] (7) 基础中的基础——流程控制语句 本来没有这一节的内容,后来考虑到既然是一个系列文章,那么就尽可能写的详细一些,本节参考了网上朋友所写的例子,为的是让更多小伙伴学习 ...

  6. [.net 面向对象编程基础] (8) 基础中的基础——修饰符

    [.net 面向对象编程基础] (8) 基础中的基础——修饰符 在进入C#面向对象核心之前,我们需要先对修饰符有所了解,其实我们在前面说到变量和常量的时候,已经使用了修饰符,并且说明了变量和常量的修改 ...

  7. 从头开始学JavaScript 笔记(一)——基础中的基础

    原文:从头开始学JavaScript 笔记(一)--基础中的基础 概要:javascript的组成. 各个组成部分的作用 . 一.javascript的组成   javascript   ECMASc ...

  8. C++ 基础中的基础 ---- 引用

    C++ 基础中的基础 ---- 引用 引用的概念:引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量.比如: int n ...

  9. python之基础中的基础(一)

    python是一个效率极高的语言,现在市面上的机器学习大部分是由python和R语言完成,所以在不久之前小仙心中便种下了学习python的想法.下面是这一个月多月以来学习的总结,都是基础中基础了. 1 ...

  10. PHP中对象的深拷贝与浅拷贝

    先说一下深拷贝和浅拷贝通俗理解 深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个 浅拷贝:赋值时,引用赋值,相当于取了一个别名.对其中一个修改,会影响另一个 PHP中, = ...

随机推荐

  1. linux devel包 和 非devel包的区别

    devel 包主要是供开发用,至少包括以下2个东西: 1. 头文件 2. 链接库 有的还含有开发文档或演示代码. 以 glib 和 glib-devel 为例: 如果你安装基于 glib 开发的程序, ...

  2. Servlet实现文件上传(多文件)(三)

    1.上传文件的页面fileUpload2.jsp <%@ page language="java" import="java.util.*" pageEn ...

  3. 【转】C++中this指针的用法详解

    1.this指针的用处 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象 ...

  4. angular中的$http配置和参数

    依赖:$httpBackend $cacheFactory $rootScope $q $injector 使用:$http(config); 参数: method:字符串,请求方法. url:字符串 ...

  5. Spring动态数据源的配置

    Spring动态数据源 我们很多项目中业务都需要涉及到多个数据源,就是对不同的方法或者不同的包使用不同的数据源.最简单的做法就是直接在Java代码里面lookup需要的数据源,但是这种做法耦合性太高, ...

  6. 【转】iOS开发路线简述

    简单看了下楼主说的很详细,尤其是最后面那个图描述很直观,让想学习ISO开发的程序猿很清晰每个步骤学习的内容,在此收藏下. iOS系统以及iPhone的出来都要感谢乔布斯,一个完美主义者,从如此优秀的i ...

  7. Mysql的收获

    今天公司的业务需求中,遇到一个很郁闷的情况. 有一个申请记录,缺少申请原因的字段. 我以为很简单,采用left jion 很容易获取到申请原因. SELECT a.*,b.RealName,c.Dep ...

  8. 查找 SqlServer死锁

    use master if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') ) dr ...

  9. Java 和Oracle的数据类型

    一.BigDecimal BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成. 如果为零或正数,则标度是小数点后的位数. 如果为负数,则将该数的非标度值乘以 ...

  10. violin 结构介绍

    参考:http://www.iqiyi.com/w_19rt9yvv9p.html 主要结构有:琴身.指板.腮托.琴马.琴弦.琴轴