学习C++语言的同学都知道,C++中类是有默认的几个函数的,主要是有四个函数:

四个函数

  1. 默认构造函数:A(void),无参构造函数
  2. 拷贝(复制)构造函数:A(const A&a)。用一个对象A去为另一个对象赋值。
  3. 析构函数:~A(void)。释放掉A所占用的空间。
  4. 赋值函数:A &original = const A&a。使用一个对象a直接为另一个对象赋值。

默认的无参构造函数和析构函数不多讲,大家都很明白,析构函数不用手动调用,是在类生命期结束的时候系统自动调用的,析构函数主要是释放分配的空间的(delete和delete[]有类似之处)。

每个类只有一个赋值函数和一个析构函数,但是构造函数却可以有多个。对于任意的一个类,如果不编写上述四个函数,C++编译器会自动生成上述四个函数。那不仅要问了,既然C++编译器这么智能,为什么我们还要编写这四个函数呢?

因为这些缺省的拷贝构造函数和赋值函数都是采用“值”操作的方式,而不是“位”操作。这会导致什么问题呢?我们可以想一些,如果类中的成员变量使用了堆空间的时候,就会出现操作的是同一个地址的问题,也就是我们所说的深复制和浅复制的问题。

深复制和浅复制

所谓浅复制,就不是对整个对象的按照位的拷贝,而是仅仅拷贝了数值,就像上面所说的,如果这个类对象中有指针类型(堆空间),那么经过拷贝构造后得到的对象和原来的对象所指向的就是同一块内存空间,那这算是拷贝么??

深复制就不一样了,是对整个对象的按照位拷贝,当遇到指针(对空间)类型变量时候,会对整个指针空间拷贝。这样可以得到两个完全不同的对象。

拷贝构造函数和赋值函数

那么还有一个问题就是拷贝构造函数和赋值函数到底有什么区别呢?都是值拷贝,那他俩貌似也就一样吧。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用。如下式子所示:

String a(“hello”);
String b(“world”);
String c = a; // 调用了拷贝构造函数,最好写成c(a);
c = b; // 调用了赋值函数

总结

当类含有动态生成的数据成员,必须自定义析构函数以释放动态分配的内存,自定义复制构造函数(Copy Structor)和复制赋值操作符(Copy Assignment Operator)实现深复制。

C++类四个默认函数&深复制&浅复制的更多相关文章

  1. C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数

    C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...

  2. 简单理解php深复制浅复制问题

    其实接触深复制浅复制是通过学习c++了解到的,比如c++很好用的模板,php是不允许方法模板和类模板 一个简单的例子,如果不是很了解php 的取地址符&,可以去看下官方文档,php的& ...

  3. C++空类中的默认函数

    定义一个空的C++类,例如 class Empty { } 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,一般编译过去就相当于 cla ...

  4. iOS 深复制&浅复制

        1.无论是深复制还是浅复制,被复制的对象类型是不变的.此对象类型具有什么功能就具有什么功能,不会因为自行修改了返回对象的指针类型而改变.   比如: 这里的str和str1的值和指针地址完全一 ...

  5. java 及 Jquery中的深复制 浅复制

    发现问题:最近 遇到由于复制对象之后,改变复制后的新变量,原先被复制的对象居然会跟着变. EX:java中: //holidayConfig.getEnd_time()会随着sTime的改变而改变 s ...

  6. iOS开发之Copy & MutableCopy及深复制 & 浅复制

    1.使用copy或mutableCopy方法可以创建一个对象的副本. copy: (1)需要实现NSCoppying协议 (2)创建的是不可变副本(如NSString.NSArray.NSDictio ...

  7. C++类指针类型的成员变量的浅复制与深复制

    本篇文章旨在阐述C++类的构造,拷贝构造,析构机制,以及指针成员变量指针悬空问题的解决.需要读者有较好的C++基础,熟悉引用,const的相关知识. 引言: 类作为C++语言的一种数据类型,是对C语言 ...

  8. c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数

    每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A ...

  9. Python深复制浅复制or深拷贝浅拷贝

    1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...

随机推荐

  1. Swift-属性监听

    监听属性的改变(开发中使用很多) oc中长是重写set方法 swift通过属性监听器 class Dog: NSObject { var name:String?{ // 属性监听器 // 属性即将改 ...

  2. TCP系列41—拥塞控制—4、Linux中的慢启动和拥塞避免(一)

    一.Linux中的慢启动和拥塞避免 Linux中采用了Google论文的建议把IW初始化成了10了.在linux中一般有三种场景会触发慢启动过程 1.连接初始建立发送数据的时候,此时cwnd初始化为1 ...

  3. (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】

    原文地址:http://www.cnblogs.com/melonblog/archive/2013/05/09/3062303.html 原文作者:豆浆油条 - melon 本文示例代码测试环境是W ...

  4. 利用书签功能对TDBGrid控件中多个记录的处理

    DELPHI 的TDBGrid 控 件 主 要 用 来 处 理 数 据 表, 它 的 属 性 中 有 一 个dgMultiSelect, 若 此 属 性 设 定 为TRUE, 则 可 以 选 中 多 ...

  5. 单源最短路径spfa模板(pascal)洛谷P3371

    题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...

  6. Java虚拟机的内存管理----垃圾收集器

    1.Serial收集器 优点,是简单而高效,单线程避免了线程交互的开销. 缺点,进行垃圾回收时需要Stop the world(暂停所有用户线程). 2.ParNew收集器 它是Serial收集器的多 ...

  7. 解决二维数组转为ArrayList集合问题

    1.修改前代码块 String[][] str = { { "语文", "100" }, { "英语", "90" }, ...

  8. 自动化生成html报告

    package Utils; import java.io.File; import java.util.Date; import org.apache.commons.lang3.time.Date ...

  9. addEventListener和attachEvent区别

    addEventListener()是标准的绑定事件监听函数的方法,是W3C所支持的,Chrome.FireFox.Opera.Safari.IE9.0及其以上版本都支持该函数:但是,IE8.0及其以 ...

  10. (转)Spring用代码来读取properties文件

    转至http://www.cnblogs.com/Gyoung/p/5507063.html 我们都知道,Spring可以@Value的方式读取properties中的值,只需要在配置文件中配置org ...