拷贝构造函数用以将一个类的对象拷贝给同一个类的另一个对象,比如之前学习过的string类:

string s1;
string s2 = s1;

一般情况下的拷贝构造函数:

class A
{
private:int n;double d;char s;
public:A(const A& a);
};A::A(const A& a)
{this->n = a.n;this->d = a.d;this->s = a.s;
}

即按照数据类型开辟一段内存空间用以存放拷贝进来的对象的数据。需要注意的是必须传递进来的是类的引用,如果是按值传递,将会生成一个临时的类的对象a,并将传递进来对象拷贝给临时对象,其实就是又调用了拷贝构造函数。

默认拷贝构造函数:

如果用户没有自定义拷贝构造函数,又使用了对象的拷贝,则编译器会自动生成一个默认构造函数,格式同上。

浅拷贝和深拷贝:

大多数情况下,使用默认构造函数就可以完成对象的拷贝(浅拷贝),但是当对象中有诸如指针、动态数组等数据类型时使用默认构造函数则可能出错,此时需要用户自定义拷贝构造函数(深拷贝),以下是一个例子,首先是没有自定义拷贝构造函数的情况:

class A
{
private:char* str;int len;
public:A(const char* s);~A();//A(const A& a);
};
A::A(const char* s)
{len = strlen(s);str = new char[len+1];strcpy(str, s);cout << str << " object construct." << endl;
}
A::~A()
{cout << str << " deleted." << endl;delete[]str;
}//A::A(const A& a)
//{
//  this->len = a.len;
//  this->str = new char[a.len+1];
//  strcpy(str, a.str);
//}

调用函数:

int main(void)
{A a1("Hello");A a2 = a1;return 0;
}

运行结果:

Hello object construct.
Hello deleted.
葺葺葺葺葺葺葺葺攐? deleted.

这是因为在对象复制的时候,由于编译器生成了默认拷贝构造函数,只是单纯的将a1中指针str的值赋值给a2中的指针str,导致a2的生命周期结束时调用析构函数将str指向的内存空间内容释放掉了,于是a1生命周期结束时调用析构函数释放掉的内存中的内容就是无意义的字符了。

去掉注释后的正确写法:

class A
{
private:char* str;int len;
public:A(const char* s);~A();A(const A& a);
};
A::A(const char* s)
{len = strlen(s);str = new char[len+1];strcpy(str, s);cout << str << " object construct." << endl;
}
A::~A()
{cout << str << " deleted." << endl;delete[]str;
}A::A(const A& a)
{this->len = a.len;this->str = new char[a.len+1];strcpy(str, a.str);
}

调用函数同上。

运行结果:

Hello object construct.
Hello deleted.
Hello deleted.

这里自定义了拷贝构造函数,申请了一块新的内存空间来存放拷贝进来的字符串,因此释放时就不会出错了。

参考:

C++拷贝构造函数(复制构造函数)详解

C++深拷贝和浅拷贝(深复制和浅复制)完全攻略

《深度探索C++对象模型 侯捷 译》

C++ 拷贝(复制)构造函数相关推荐

  1. C++何时调用拷贝(复制)构造函数

    StringBad ditto (motto); StringBad metoo = motto; StringBad also = StringBad(motto); StringBad * pSt ...

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

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

  3. 复制构造函数(拷贝构造函数)

    也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生.对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什 ...

  4. C++——构造函数(拷贝构造,拷贝复制),析构函数,操作符重载

    C++--构造函数(拷贝构造,拷贝复制),析构函数,操作符重载 构造函数与析构函数:: 涉及构造函数还可以看这篇文章C++搞懂深拷贝初始化=与赋值=的区别 1.声明和定义构造函数和析构函数 构造函数在 ...

  5. C++深复制(深拷贝)、浅复制(浅拷贝)和复制构造函数(拷贝构造函数)详解+实例

    转载出处:https://blog.csdn.net/sxhelijian/article/details/23209967 对象的复制 对于普通类型的对象来说,它们之间的复制是很简单的,例如: in ...

  6. C++拷贝构造函数(复制构造函数)详解

    link 复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用. 如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数.大多数情况下,其作用是实现从源对象到目 ...

  7. C++ Copy Constructor (拷贝构造函数,复制构造函数)

    1.什么是Copy Constructor? Copy Constructor 是一个特殊的构造函数,一般只有一个参数,这个参数一般是用const修饰的,对自己类的一个引用(reference).什么 ...

  8. 拷贝构造函数c语言,C++拷贝构造函数(复制构造函数)详解

    复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用. 复制构造函数的参数可以是 const 引用,也可以是非 const 引用. 一般使用前者,这样既能以常量对象(初 ...

  9. [ C++ ] — 拷贝构造函数(复制构造函数)

    拷贝构造函数 拷贝构造函数就是用 同一类型的对象复制成员值来初始化对象(当出现类的 "=" 赋值时,就会调用拷贝构造函数) 简单来说,拷贝构造函数就是来复制对象的 默认拷贝构造函数 ...

  10. C++ 构造函数、复制构造函数,拷贝构造函数(深拷贝、浅拷贝)

    文章目录 前言 一.什么是构造函数? 二.构造函数的分类 复制构造函数 复制构造函数被调用的三种情况 复制构造函数在以下三种情况下会被调用. 三.拷贝构造函数的分类 深.浅拷贝构造函数的区别 示例代码 ...

最新文章

  1. Centos7搭建Kubernetes集群
  2. Mysql的命令行操作
  3. 重学java基础第五课:博客的重要性
  4. HTML5 API详解(6):getUserMedia实现拍照功能
  5. openvas 配置遇到的问题
  6. mysql存储过程 等于_mysql存储过程字符串等于
  7. linux .net core 后台执行,.NET Core基于Generic Host实现后台任务方法教程
  8. 深度优先遍历访问的边集合_数据结构与算法: 三十张图弄懂「图的两种遍历方式」...
  9. 常用模块 re模块
  10. 手机数控模拟器安卓版_数控模拟器手机版下载-数控模拟器安卓手机版v1.1.4-河东软件园...
  11. 批量获取中国所有行政区域经边界纬度坐标(到县区级别)
  12. JS 更合理的随机分组
  13. Blog的浏览量达到1000时将发布“曾经桑海难为水之三”
  14. 彻底解决win10黑屏,睡眠后无法唤醒(Intel平台)
  15. 被电动牙刷改变的人生,他现在是拥有百万粉丝的网红
  16. Matlab实现图像插值和降低图像灰度级
  17. 非参数检验之符号检验、Wilcoxon符号秩检验、游程检验
  18. 3.(基础)tornado的接口调用顺序与模板
  19. 酷狗音乐导入ipod_iPod死了,听音乐也不会让人分心
  20. 前端学习记录——offset与client

热门文章

  1. E488: Trailing characters:
  2. 教你使用借贷宝0成本赚钱
  3. 干货 | 小米A/B实验场景查询提速:数据预聚合方案
  4. PM_28 招投标法、政府采购法
  5. Python将字符串类标签更改为int
  6. [LC] 307. Range Sum Query - Mutable
  7. 基于Anaconda3环境下的CNTK安装
  8. 解决Python+selenium 自动化测试打开浏览器自动关闭问题适用于(Chrome和Edge)
  9. Day1学习(计算机基础)
  10. PHP项目进程管理系统可以用wamp、phpstudy运行定制开发mysql数 据库BS模式