1、如果没有声明copy构造方法,copy赋值操作符,和析构方法,编译器会自动生成这些方法,且是inline。

2、如果没有声明任何构造方法,编译器会自动生成一个default构造方法,且是inline。

3、编译器总是为我们生成一个合成析构方法。

4、首先考虑,编译器生成的copy构造方法做什么事?

  copy构造方法是一个特殊的构造方法,形参是const T&。编译器生成的copy构造方法逐个成员初始化。逐个成员初始化:对于创建对象的每个non-static字段,使用现有对象的字段去初始化。

  如果字段是类类型,递归调用类的copy构造方法。如果是内置类型,逐个bit拷贝。需要注意的是:对于引用和指针,复制引用和指针。不同类型的指针,指明了指向对象的类型,但是指针本身是int类型,就是一个地址,引用是用指针实现出来的。因此,对于引用和指针,也是逐个bit拷贝,因为它们本身的类型是int。

  还有一个特殊的情况:类中的数组。一般情况下,数组是不能赋值的,但是类中的数组是可以复制的,逐个元素进行拷贝。

  对于编译器生成的copy构造方法,可以这样认为:在初始化列表中,使用现有对象的每个字段去初始化正在创建对象的字段。

5、编译器生成的copy赋值操作符做什么事?

  copy赋值操作符,就是重载了操作符=,返回T&,形参是const T&。编译器生成的copy赋值操作符逐个成员赋值。逐个成员赋值:对于当前对象的每个non-static字段,使用rhs的字段进行赋值。那么问题来,

  我们知道,类中的有些字段是只能初始化,不能赋值的,也就是不能修改。包括:类中的引用和const字段,这种情况下,编译器不会为我们生成copy赋值操作符。

  还有一种情况,父类的copy赋值操作符是private,编译器也不会为子类生成copy赋值操作符。为什么?因为子类期望调用父类的copy赋值操作符,对父类的成分赋值,由于父类的copy赋值操作符是private,不能调用,编译器也就不为子类生成copy赋值操作符了。

6、可以认为有两个析构方法:析构方法和合成析构方法。前者用于释放动态获取的资源,后者用于按对象创建的逆序撤销每个non-static字段。对象超出作用域,先调用析构方法,再调用合成析构方法,在合成析构方法中,对于类类型,递归调用它的析构方法和合成析构方法,对于内置类型,不需要做什么。

  有个三法则:如果类需要析构方法,那么它也需要自定义copy构造方法和copy赋值操作符。为什么?怎么理解?

  析构方法,用于释放动态获取的资源,定义了析构方法,说明类中有指针。在上文中,我们知道,指针本身是int类型,copy构造和copy赋值的时候,只是拷贝指针值,并没有拷贝指向的对象,这就导致两个对象中的指针,指向同一块数据,这往往不是程序员所期望的。因此,需要自定义copy构造和copy赋值,对指向的数据也进行拷贝,也就是深拷贝。

7、编译器生成的default构造方法,成员初始化列表为空,这就意味着,类中的内置类型字段没有被初始化。为了保证对象被使用之前,先被初始化,这情况下需要提供一个构造方法,对内置类型的字段初始化。

【05】了解C++默默编写并调用那些函数的更多相关文章

  1. Effective C++ -----条款05:了解C++默默编写并调用哪些函数

    面对“内含reference成员或者含const成员”的class内支持赋值操作,你必须自己定义copy assignment操作符. 如果某个base classes将copy assignment ...

  2. EC笔记,第二部分:5.了解C++默默编写并调用哪些函数

    5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或con ...

  3. Effective C++ 之 Item 5:了解C++默默编写并调用哪些函数

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 5 ...

  4. 条款05:了解C++默默编写并调用哪些函数

    每一个class都会有一个或多个构造函数.一个析构函数.一个copy assignment操作符.这些控制着基础操作,像是产出新对象并确保它被初始化.摆脱旧对象并确保它被适当清理.以及赋予对象新值. ...

  5. effective c++(05)(06)之c++默默编写并调用的函数

    1. 当只写一个空类的时候,编译器会为他声明一个copy构造函数,一个copy assignment函数和一个析构函数.如下: 如果写下: class Empty{ }; 编译器就会实现以下代码: c ...

  6. Effective C++条款05:了解C++默默编写并调用哪些函数

    class Empty{}; class Empty{ Empty(){}; Empty(const Empty& rhs){}; ~Empty(){}; Empty& operato ...

  7. [Effective C++ --005]了解C++默默编写并调用哪些函数

    <前言>编译器是个十分敬业的工作者,不但为你编译代码,甚至为你生成代码,不可思议吧.本文主要介绍编译器究竟会为我们生成和调用哪些代码. <空类和非空类>如果问什么样的类是空类? ...

  8. 了解 C++ 默默编写并调用的函数

    前言 对于一个类来说,最最基础的三类成员函数莫过于:构造函数,析构函数以及拷贝函数 (copy构造函数和=重载函数).即使你的类没有为这些函数做出定义,C++ 也会自动为你创建.本文将讲述的是 C++ ...

  9. C++编译器默默编写并调用哪些函数

    什么时候empty class(空类)不再是个empty class呢?当C++处理过它之后,是的,如果你自己没有声明,编译器就会为它声明(编译器版本)一个copy构造函数.一个copy assign ...

随机推荐

  1. 今日网站突然报错,mysql的故障

    Access denied for user 'root'@'localhost' (using password: YES) 错误位置 FILE: /var/www/html/ThinkPHP/Li ...

  2. activity的测试工程activiti-explorer使用

    1. activiti-explorer默认使用h2数据库,第一步要修改db.properties的配置,如果使用其他数据库的话,务必放入驱动包,oracle的ojdbc4不能用,会报错,要使用版本高 ...

  3. 使用 DiskMaker X 轻松制作 Yosemite 安装 U 盘(引)

    使用 DiskMaker X 轻松制作 Yosemite 安装 U 盘 由于帮人在MacBook上装Windows, 用pe格式化了一下分出来的Windows分区, 搞得Mac系统也瘫掉了, 无奈之下 ...

  4. 【HDOJ】2102 A计划

    BFS,不过有很多地方需要注意,比如传送机传送到另一个传送机.还有要注意格式. #include <iostream> #include <cstdio> #include & ...

  5. HTML5实现在线抓拍

    <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...

  6. 一个TextView使用不同的颜色

    一个TextView使用不同的颜色: textview中首先需要已经有内容了 public static void ColorFormatTextView(TextView tv,int color, ...

  7. Android Activity管理类

    public class AppManager { private static Stack<Activity> activityStack; private static AppMana ...

  8. python导入模块时的路径疑惑

    有一个事儿,以前没注意,今天发现了,记录一下. 假设一个python文件a.py中,有一段代码,是打印当前路径的.当单独执行a.py文件的时候,打印的是a.py的位置. 但是当a.py文件被其他pyt ...

  9. 关于sharepoint事件接收器中properties.AfterProperties[""].Tostring()取值的问题。

    这个这个属性是不能获取到中文的意思,他是获取AfterProperties的集合的值. string name=properties.AfterProperties["登录人"]. ...

  10. C#学习:集合、迭代、泛型(1)

    一.System.Collections名称空间下几个接口表征着集合的功能: 1.IEnumerable:表征着迭代功能 public interface IEnumerable { IEnumera ...