对于普通类型的对象来说,他们之间的复制是简单的,比如:

int a = 88;

int b = a;

而类和普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。

#include <iostream>
using namespace std;

class CExample {
private:
int a;
public:
     CExample(int b)
{ a=b;}
void Show ()
{
        cout<<a<<endl;
    }
};

int main()
{
     CExample A(100);
     CExample B=A;
     B.Show ();
return 0;
}

运行程序,屏幕输出100。从以上代码运行结果可以看出,系统为B分配了内存并完成了对象A的复制过程。

就对象而言,相同类型的对象是通过拷贝构造函数来完成整个复制过程的。

CExample(const CExample& C)
{
        a=C.a;
}

CExample(const CExample& C)就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变的。例如:类X的拷贝构造函数的形式为X(X& x)。

当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另外一个对象进行初始化。

如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝,后面将进行说明。

自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。

浅拷贝和深拷贝

  在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B把内存释放了(如:析构),这时A内的指针就是野指针了,出现运行错误。

  深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。下面举个深拷贝的例子。

#include <iostream>
using namespace std;
class CA
{
 public:
  CA(int b,char* cstr)
  {
   a=b;
   str=new char[b];
   strcpy(str,cstr);
  }
  CA(const CA& C)
  {
   a=C.a;
   str=new char[a]; //深拷贝
   if(str!=0)
    strcpy(str,C.str);
  }
  void Show()
  {
   cout<<str<<endl;
  }
  ~CA()
  {
   delete str;
  }
 private:
  int a;
  char *str;
};

int main()
{
 CA A(10,"Hello!");
 CA B=A;
 B.Show();
 return 0;
}

转载于:https://www.cnblogs.com/davidsguo008/p/3607167.html

拷贝构造函数——防篡改相关推荐

  1. 深入解析网页防篡改技术

    目前,网页防篡改产品(后面简称"防篡改产品")市场如火如荼,产品质量良莠不齐,品牌多而繁杂,让人看了不知所措.本文着重从技术角度分析各种类型的网页防篡改技术(后面简称"防 ...

  2. 网页防篡改技术的前世与今生

    2019独角兽企业重金招聘Python工程师标准>>> 2013年1月15日,中国互联网络信息中心(CNNIC)在京发布第31次<中国互联网络发展状况统计报告>(以下简称 ...

  3. 浅谈网页防篡改技术的前生今世

    21世纪是互联网发展飞速的一个时代,根据联合国宽带可持续发展委员会发布的报告,截至2015年底,全球约有32亿人已经用上互联网,2016年底这个数字能达到35亿. 互联网已经到渗透各行各业,并且在逐渐 ...

  4. C++ 复制构造函数或者拷贝构造函数

    复制构造函数 是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象. 复制构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象. 复制对象把它作为参数传 ...

  5. C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)

    1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...

  6. 【C++】何时需要自定义拷贝构造函数和赋值符

    先来说结论:当类中有指针类型成员变量的时候,一定要自定义拷贝构造和赋值运算符 原因:当我们在有指针类成员变量的时候,还是用默认拷贝构造函数(拷贝构造函数执行的时候会调用赋值符),默认赋值为浅拷贝,会导 ...

  7. C++ 拷贝构造函数和重载赋值运算符的区别

    文章目录 拷贝构造函数 重载赋值运算符 赋值运算符和拷贝构造函数最大区别是赋值运算符没有新的对象生成,而拷贝构造函数会生成新的对象. 为了更加形象 准确得描述 赋值运算符和拷贝构造函数得区别,将详细通 ...

  8. 函数返回类的对象与拷贝构造函数

    C++中,如果我们在一个函数中,定义了一个类的对象,然后返回这个对象,在main函数中用一个对象去接受这个返回的对象的时候,这里面参与的函数调用大家可能不熟悉,这里通过程序和注释的方式给大家讲解一下. ...

  9. 拷贝构造函数和赋值函数的一些知识

    /*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能. 2. ...

最新文章

  1. python获取图片像素矩阵_用python处理图片实现图像中的像素访问
  2. linux shell命令行及脚本编程实例详解_超全整理!这些Shell编程必备知识你都掌握了吗?...
  3. 如何处理Docker错误消息:please add——insecure-registry 1
  4. linux mongo 服务器,如何用MongoDB在Linux服务器上创建大量连接和线程的记忆
  5. Linux中 print用法,linux之find中的-print0和xargs中-0用法
  6. 项目管理---(1) 项目管理流程
  7. Facebook研究院院长:AI不会取代人类
  8. LSI SAS 3008配置操作
  9. 非常实用的在线工具网站清单
  10. 计算机图形学基础第七章ppt,第三章 计算机图形学基础ppt课件.ppt
  11. Android系统启动源码分析
  12. ICP备案线下注销 网站域名备案注销
  13. 注意力机制与V_net神经网络的介绍与实现
  14. 网络就好似一个个树洞
  15. 成都普赛睿生物医药科技有限公司-IT岗位招聘
  16. 5G NR Polar码系统编码和非系统编码(二)
  17. java编写car类_java编写一个汽车类,有属性:品牌、型号、排量、速度,有方法:启动、加速、转弯、刹车、息火...
  18. kali arp-scan网络扫描工具 扫描局域网ip地址
  19. anytime you feel the pain,hey,dear,refrain
  20. dash dock安装 to_Dash to Dock 安装配置(图文教程)

热门文章

  1. c 语言输出字符用什么作用是什么,C语言中输出字符串用什么符号
  2. 创建微服务多模块项目
  3. php h5视频录制上传,基于koa的h5视频录制异步上传
  4. python标准库os_Python标准库 os
  5. 怎样安装php5_如何安装php5.3
  6. python列表知识点_列表知识点整理
  7. 查询数据库现在几个用户在连接
  8. SQL中Convert()函数的使用方法
  9. Linux Redis集群搭建与集群客户端实现
  10. python bokeh slider_Bokeh数据可视化工具3视觉增强及服务器