C++拷贝构造函数

在定义任何C++类时,拷贝空置操作都是必要部分,类需要控制拷贝、赋值和销毁对象时发生的行为。拷贝构造函数的用途:当创建了一个新对象时,可以用另一个对象的数据初始化这个新建的对象。

1、默认拷贝构造函数

  如果在程序中我们没有显示定义拷贝构造函数,则C++会为每个类隐式地提供一个缺省的拷贝构造函数,不过就算我们显示定义了拷贝构造函数,程序同样也会自己合成一个默认的构造函数。缺省的构造函数简单地将参数对象的每个数据域复制给对象中相应的副本。拷贝构造函数和赋值运算符是相似的,它们把一个对象的值赋给另一个对象,但两者不一样!使用拷贝构造函数将创建新的对象,而使用赋值运算符则不会创建新对象。比如下面的例子:

  1. //circle.h
  2. #ifndef _CIRCLE_H_
  3. #define _CIRCLE_H_
  4.  
  5. class Circle{
  6. public:
  7. Circle();
  8. Circle(double radius);
  9. ~Circle();
  10. void setRadius(double radius);
  11. double getRadius();
  12. double getArea();
  13. private:
  14. double radius;
  15. };
  16.  
  17. #endif //circle.h
  1. #include "circle.h"
  2. #include <iostream>
  3.  
  4. Circle::Circle(){
  5. radius = ;
  6. }
  7.  
  8. Circle::Circle(double radius){
  9. this->radius = radius;
  10. }
  11.  
  12. void Circle::setRadius(double radius){
  13. this->radius = radius;
  14. }
  15.  
  16. double Circle::getRadius(){
  17. return radius;
  18. }
  19.  
  20. double Circle::getArea(){
  21. return 3.14159 * radius * radius;
  22. }
  23.  
  24. Circle::~Circle(){
  25. }

测试函数main:

  1. #include <iostream>
  2. #include "circle.h"
  3. using namespace std;
  4.  
  5. int main(){
  6. Circle c1();
  7. Circle c2(c1); //这里没有显示定义拷贝构造函数,编译器就隐式调用了一个
  8.  
  9. cout << "The c1 radius is " << c1.getRadius()
  10. << " and area is " << c1.getArea() << endl;
  11.  
  12. cout << "The c2 radius is " << c2.getRadius()
  13. << " and area is " << c2.getArea() << endl;
  14.  
  15. ;
  16. }

运行结果如下(我们发现两个Circle对象c1和c2数据域都是一样的):

2、“深拷贝”和“浅拷贝”

  “浅拷贝”指的是拷贝指针的地址,不拷贝该指针指向的内存内容;“深拷贝”指的是拷贝指针指向的内存内容,不拷贝指针本身。程序隐式生成的拷贝构造函数和赋值运算符进行对象复制采用的是一种所谓的“浅拷贝”。

C++拷贝构造函数专题的更多相关文章

  1. C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...

  2. C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别

    class TestChild { public: TestChild() { x=; y=; printf("TestChild: Constructor be called!\n&quo ...

  3. C++ 为什么拷贝构造函数参数必须为引用?赋值构造函数参数也必须为引用吗?

    之前写拷贝构造函数的时候,以为参数为引用,不为值传递,仅仅是为了减少一次内存拷贝.然而今天看到一篇文章发现自己对拷贝构造的参数理解有误. 参数为引用,不为值传递是为了防止拷贝构造函数的无限递归,最终导 ...

  4. C++拷贝构造函数

    拷贝构造函数是一种特殊的构造函数,其定义为第一个参数为为本类型的一个引用或者是常引用,且无其它参数或者其它参数为默认值,例如下面的函数: X::X(const X&); X::X(X& ...

  5. PoEdu - C++阶段班【Po学校】- Lesson03-4_构造函数&赋值函数&拷贝构造函数&学习方式 - 第6天

    PoEdu - C++阶段班[Po学校]- 第6天 课堂选择题目: 1  关于转换构造函数  ClassDemo demo = 1;  调用转换构造函数 2  关于拷贝赋值函数  demo =2; 首 ...

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

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

  7. C++ 拷贝构造函数 和 六大函数

    1.  C++什么时候会调用 拷贝构造函数? a.一个对象作为函数参数,以值传递的方式传入函数体: b.一个对象作为函数返回值,以值传递的方式从函数返回:(实际使用时,会被编译器优化掉) c.一个对象 ...

  8. 一个CString的实现 拷贝构造函数的应用

    class CString { public: CString (char* s); CString(); ~CString(); private: char *str; int len; stati ...

  9. 【转】C++的拷贝构造函数深度解读,值得一看

    建议看原帖  地址:http://blog.csdn.net/lwbeyond/article/details/6202256 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很 ...

随机推荐

  1. amoeba

    Amoeba 原理:amoeba相当于业务员,处理client的读写请求,并将读写请求分开处理.amoeba和master以及slave都有联系,如果是读的请求,amoeba就从slave读取信息反馈 ...

  2. fileZilla 设置 记录一笔 以防忘记

  3. django框架(View)

    -------------------URLconf-------------------1.设置 1.在settings.py文件中通过ROOT_URLCONF指定根级url的配置 2.urlpat ...

  4. 深入浅出数据结构C语言版(16)——插入排序

    从这一篇博文开始,我们将开始讨论排序算法.所谓排序算法,就是将给定数据根据关键字进行排序,最终实现数据依照关键字从小到大或从大到小的顺序存储.而这篇博文,就是要介绍一种简单的排序算法--插入排序(In ...

  5. 在ubantu上安装hive

    上次我们在ubantu上安装了hadoop,那我们现在再进一步,开始我们的学习之旅--hive板块吧! 第一步:准备! 软件: I.一个搭建好的hadoop环境 II.hive的bin文件(前往apa ...

  6. java内存管理(堆、栈、方法区)

    java内存管理 简介 首先我们要了解我们为什么要学习java虚拟机的内存管理,不是java的gc垃圾回收机制都帮我们释放了内存了吗?但是在写程序的过程中却也往往因为不懂内存管理而造成了一些不容易察觉 ...

  7. POI操作Excel的API注意点总结

    本篇是关于POI.jar操作Excel的API注意事项 基数问题 说明:我使用的是POI 3.15版本的,在版本问题上建议大家,在版本稳定的基础上尽量使用高版本的 看过很多帖子在问一个问题:假设原来有 ...

  8. 【grunt】两小时入门

    目录: 1. 用途和场景 2.Grunt插件 3.相关资源 4.环境安装 5.开始学习 5.1 一个新项目 5.2 生成package.json 5.3 在项目中安装grunt和相关插件 5.4 Gr ...

  9. mysql数据类型double和decimal区别详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt336 实数是带有小数部分的数字.然而,它们不只是为了存储小数部分,也可以使用 ...

  10. MyEclipse使用(一)

    一.配置 window ----> preferences (1)配置 JDK java--->Installed JREs --> Add ---> JRE name --- ...