当前位置:  编程技术>c/c++/嵌入式

C++中拷贝构造函数的总结详解

    来源: 互联网  发布时间:2014-10-20

    本文导语:  1.什么是拷贝构造函数: 拷贝构造函数嘛,当然就是拷贝和构造了。(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数。百度百科上是这样说的:拷贝构造函数...

1.什么是拷贝构造函数:
拷贝构造函数嘛,当然就是拷贝和构造了。(其实很多名字,只要静下心来想一想,就真的是顾名思义呀)拷贝又称复制,因此拷贝构造函数又称复制构造函数。百度百科上是这样说的:拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。

2.拷贝构造函数的形式

代码如下:

Class X
{
public:
  X();
  X(const X&);//拷贝构造函数
}

2.1为什么拷贝构造参数是引用类型?
其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动被调用来生成函数中的对象(符合拷贝构造函数调用的情况)。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象,这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。

3.拷贝构造函数调用的三种形式
3.1.一个对象作为函数参数,以值传递的方式传入函数体;
3.2.一个对象作为函数返回值,以值传递的方式从函数返回;
3.3.一个对象用于给另外一个对象进行初始化(常称为复制初始化)。

总结:当某对象是按值传递时(无论是作为函数参数,还是作为函数返回值),编译器都会先建立一个此对象的临时拷贝,而在建立该临时拷贝时就会调用类的拷贝构造函数。

4.深拷贝和浅拷贝
如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。(位拷贝又称浅拷贝,后面将进行说明。)自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。

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

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

下面举个深拷贝的例子。

代码如下:

#include
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

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c#对象中两种copy操作:深拷贝(Deep Copy)与浅拷贝(Shallow Copy)
  • Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
  • python中的深拷贝(deepcopy)和浅拷贝(copy)介绍及代码参考
  • 关于redhat linux7.3文件拷贝:我要将/dev下的全部文件拷贝到另一个已mount的硬盘上,怎么大部分文件拷不过去呢??
  • c# 深拷贝与浅拷贝的区别分析及实例
  • 快速文件拷贝工具 FastCopy
  • scp远程拷贝问题
  • cp命令拷贝目录的问题 求教
  • 关于“零拷贝”问题
  • 从Linux拷贝文件时,总出现符号链接错误时怎么回事?
  • 如何用shell脚本实现二进制拷贝?
  • 拷贝文件的问题
  • 如何将整个文件夹都拷贝过去?
  • vim 如何段拷贝。
  • [Suse Linux]两台机器上怎样能快速拷贝大量的文件
  • RH9下文件拷贝出错问题,求教
  • DVD 拷贝工具 dvd:rip
  • fpt拷贝文件问题
  • 两台UNIX机器之见如何拷贝文件
  • 远程拷贝目录的问题
  • 求简单文件拷贝命令??




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3