构造&析构函数

  构造函数

    定义:与类同名,可以有参可以无参,主要功能用于在类的对象创建时定义初始化的状态,无返回值,也不能用void修饰,构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用

      一个类若是只定义了私有的构造函数,将无法通过new关键字来创建其对象,若是没有定义,那么编译器会提供一个默认的构造函数,构造函数可以有多个,

    构造列表:即构造函数初始值列表,在构造列表中的变量是直接初始化,在函数体内的则是先调用默认构造函数初始化再赋值,这不仅事关底层效率问题,更重要的是一些数据成员必须初始化,

      在构造函数初始化顺序与它们在类定义中的出现顺序保持一致,一般来说初始化的顺序没什么特别要求,不过如果一个成员是用另一成员来初始化的,那么这两个成员的初始化顺序就很重要了

      如果可能,尽量避免用一个值来初始化另一个值

  explicit 修饰的构造函数必须显示调用,另外修饰的函数不能进行隐式转换。在C++中如果定义了参数列表中的参数,但是在函数内部却没有使用到,那么编译器会报参数没有使用的警告,

  拷贝构造函数

    定义:以同型对象初始化自我对象,一般类都会定义一个默认构造函数,一个拷贝构造函数,一个拷贝分配操作符,即使不需要也会定义为私有的不实现,以防编译器自己定义

      class Widget{

        public:                  //这里设置为public,是因为这里要使用,其他情况一般都设为private,且不实现

          Widget();                //default构造函数

          Widget (const Widget &rhs);        //copy构造函数

          Widget &operator = (const Widget &rhs);  //拷贝分配操作符,一般要返回一个指针的,不强制要求

          ...

        }

    Widget w1;                    //调用default构造函数

    Widget w2(w1);                  //调用拷贝构造函数

    w1 = w2;                      //调用分配操作符

    Widget w3 = w2;                  //调用拷贝构造函数,注意区分与拷贝赋值的关系

  析构函数

    定义:与构造函数相反,当对象结束其生命周期时,系统自动执行析构函数,析构函数与构造函数名相同,只是在函数名前加~以示区别,析构函数只有一个,不能重载,如果用户并没有定义,那么

      编译器也会自动生成一个缺省的析构函数,不要在析构函数中调用exit(),因为析构函数本身即会调用,若是主动调用exit(),则会陷入无限循环,由于析构函数能够自动进行类缺省的清理工作,

      如果调用成员或基类的析构函数一样,所以通常并不需要在析构函数的定义中显示地编写任何代码

    使用:一般情况下我们不直接调用析构函数,而如果我们需要调用析构函数里面的功能,那么建议将此功能写成一个普通的函数

  创建子类对象:此对象先调用基类的构造函数构造对象的基类部分,再调用子类的构造函数构造对象的子类部分

  销毁子类对象:此对象先调用子类的析构函数析构对象的子类部分,再调用基类的析构函数析构对象的基类部分

    总结:可以想象一下, 子类对象可以访问父类,如果在构造子类对象的子类部分时基类没构建完成,而子类就调用了基类的东西,那么肯定会出问题,所以构造要先构造对象的基类部分

        同理,析构时如果先析构子类对象的基类部分,那么在基类析构完成后子类如果再调用基类,那么也会出问题,所以析构要先析构对象的子类部分,就像盖楼从基层盖起,拆楼从顶层拆起

构造&析构的更多相关文章

  1. C++ map.insert 传参类型不同,构造/析构次数不同

    1. 传参方式 使用 insert 为 map 插值时,insert 的传参包含以下几种可能: make_pair 生成对象 pair(key_type, value_type) 生成对象 pair( ...

  2. EffectiveC++ 第2章 构造/析构/赋值运算

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 2 构造 / 析构 / 赋值 条款 05:了解C++ ...

  3. Effective C++ —— 构造/析构/赋值运算(二)

    条款05 : 了解C++默默编写并调用哪些函数 编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 1. default构造函 ...

  4. 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  5. 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  6. c++继承构造析构调用原则以及特殊变量处理

    一.继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类构造函数 3.当父类构造函数有参数时,需要在子类的初始化列表中显示调用: 4.析构函数调 ...

  7. HexoC++第04课 构造析构.md

    C++第04课 构造析构.mdhtml {overflow-x: initial !important;}#write, body { height: auto; } #write, #write h ...

  8. C++学习笔记 构造&析构 友元 new&delete

    构造&析构函数 构造函数 定义:与类同名,可以有参可以无参,主要功能用于在类的对象创建时定义初始化的状态,无返回值,也不能用void修饰,构造函数不能被直接调用,必须通过new运算符在创建对象 ...

  9. C++ 类、构造析构、深拷贝

    1st,感性理解类的思想,就是把数据和对数据的操作打包在一块儿,设计类的时候要 想好数据部分和 要进行的操作.以下是时间类的示意,时间包含时分秒,Time为构造函数,该类支持的操作就是设置时间和读取时 ...

  10. 构造 & 析构 & 匿名对象‍

    ‍以前仅知道创建对象,但对匿名对象的了解基本为0. 通过阅读google chromium源代码 中关于 log 的使用,查阅相关资料,了解了一下匿名对象,予以记录. 什么是匿名对象‍ 匿名对象可以理 ...

随机推荐

  1. SAP FI CO模块常用事务代码

                                                                                                        ...

  2. HDU 4318 Power transmission(最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=4318 题意: 给出运输路线,每条路线运输时都会损失一定百分比的量,给定起点.终点和初始运输量,问最后到达终点时最 ...

  3. Spring数据库连接池依赖

    <!-- https://mvnrepository.com/artifact/c3p0/c3p0 --> <dependency> <groupId>c3p0&l ...

  4. bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4352  Solved: 1387[Submit][Stat ...

  5. IDEA中mybatis插件自动生成手写sql的xml文件

    上图: 选择这个安装,然后重启IDEA,ok.

  6. strtotime 获取之前,之后时间

    一年之前 <?php echo strtotime('-1 year'); ?> 一年之后 <?php echo strtotime('+1 year'); ?> 一月之前 & ...

  7. typeScript入门基础 (1)

    1.ts是js的超集,可使用es5,es6的代码 2. ts的安装与编译: a.  首先需要Node.js环境 .  相信都有,略过. 不会的请百度,或者留言. b.  npm  install  - ...

  8. 类的调用1(被调用的MyFirstJava)

    package com.mec.MyFirstJavaLife.text; public class MyFirstJava { /**   * @param args   */ private in ...

  9. xlua修复C#的委托事件的时候,需要提前做好配置

    如下所示: //C#静态调用Lua的配置(包括事件的原型),仅可以配delegate,interface [CSharpCallLua] public static List<Type> ...

  10. python+selenium基础之XPATH定位(第一篇)

    世界上最远的距离大概就是明明看到一个页面元素矗在那里,但是我却定位不到!! selenium定位元素的方法有很多种,像是通过id.name.class_name.tag_name.link_text等 ...