Item 05:了解C++默默编写并调用了哪些函数

总结:编译器可以暗自为class创建default 构造函数、copy构造函数、copy assignment操作符,以及析构函数。

(这一小节比较简单,想要深入了解可以翻阅深入探索C++对象模型的笔记)


Item 06:若不想明确使用编译器自动声称的函数,就该明确拒绝

方法1:将该成员函数声明为private

不过这种方法有个缺点,就是该class的friend函数和member函数可以调用该函数,所以还需要将该函数的函数体写成空。

总结:为驳回编译器(暗自)提供的机能,可将相应的成员函数声明为private并且不给予实现。


Item 07:为多态基类声明virual 析构函数

当子类对象由一个base class的指针删除的时候,而该base类带有一个non-virtual 的析构函数,其结果未定义——实际执行的时候通常是该类的子类部分没有被销毁。

解决办法:给base class一个virtual析构函数,这样才能达到目的。

总结:

1.polymorphic(带多态性质的)base classes应该声明一个virtual析构函数。如果该类带有任何virtual函数,它就应该拥有一个virtual的析构函数。

2.class的设计目的如果不是作为base class使用,或者不是为了具备多态性质,就不应该声明virtual 析构函数。


Item 08:别让异常逃离析构函数

总结:

1.析构函数绝对不要吐出异常。如果一个析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常并且吞下它们或者关闭程序。

(这一点很好理解,如果代码运行跳出了析构函数,那么后面的销毁操作就可能不会被执行,这样极易造成内存泄露!)

2.如果客户需要在对某个操作函数运行期间抛出的异常作出反应,那么class应该提供一个(而不是在析构函数中)普通的函数来处理。


Item 09:绝对不在构造和析构函数中调用virtual函数

在子类对象的base class构造期间,对象的类型是base class而不是derived class。不止virtual函数会被编译器解析为base class的,也会把对象视为base class类型。所以在这种情况下调用virtual函数,往往得不到正确的结果。

同样的道理也适用于析构函数。

总结::在构造和析构期间绝对不要调用virutal函数,因为该函数的调用绝对不会下降到derived class层。(比起当前执行virtual函数的这这一层)。


Item 11:在operator=中处理自我赋值

总结:

1.请确保当前对象和赋值的对象不是同一个对象,其中包括比较“来源对象”和“目标对象”的地址、语句顺序和copy-and-swap。

2.确保任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为依旧正确。


Item 12:确保复制对象时候不要忘记每一部分

总结:

1.copy函数应该确保复制“对象内的所有成员变量”及“所有的base class 成分”。

2.不要尝试以某个copy函数实现另一个copying函数,应该将共同机能放进第三个函数中,由两个函数共同调用。

《Effective C++》构造、析构、赋值运算的更多相关文章

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

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

  2. Effective C++ -- 构造析构赋值运算

    05.了解C++默默编写并调用哪些函数 编译产生的析构函数时non-virtual,除非这个类的基类析构函数为virtual 成员变量中有引用和const成员时,无法自己主动生成copy assign ...

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

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

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

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

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

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

  6. Effective C++ 笔记二 构造/析构/赋值运算

    条款05:了解C++默默编写并调用哪些函数 编译器默认声明一个default构造函数.一个copy构造函数.一个copy assignment操作符和一个析构函数.这些函数都是public且inlin ...

  7. Effective C++笔记:构造/析构/赋值运算

    条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...

  8. Effective C++笔记(二):构造/析构/赋值运算

    参考:http://www.cnblogs.com/ronny/p/3740926.html 条款05:了解C++默默编写并调用哪些函数 如果自定义一个空类的话,会自动生成默认构造函数.拷贝构造函数. ...

  9. 【Effective C++】构造/析构/赋值运算

    条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...

  10. Effective C++ 2.构造 析构 赋值运算

    //条款07:为多态基类声明virtual析构函数 // 1.若基类的析构函数不定义为虚函数,由于基类的指针或引用可以指向派生类的对象,则在删除基类对象的时候可能会出错,导致破坏数据结构. // 2. ...

随机推荐

  1. 路由组件构建方案(分库分表)V1

    路由组件构建方案V1 实现效果:通过注解实现数据分散到不同库不同表的操作. 实现主要以下几部分: 数据源的配置和加载 数据源的动态切换 切点设置以及数据拦截 数据的插入 涉及的知识点: 分库分表相关概 ...

  2. Linux基础_7_文本显示

    注:实质是针对标准输出文本的各种骚操作! 简单查看 注:初略加工后进行显示. cat -n 文件名 #查看文件内容并显示行号 tac 文件名 #逆序查看 more 文件名 less 文件名 #按?搜索 ...

  3. 给 hugo 博客添加搜索功能

    起因 我的博客使用了 hugo 作为静态生成工具,自带的主题里也没有附带搜索功能.看来,还是得自己给博客添加一个搜索功能. 经过多方查找,从 Hugo Fast Search · GitHub 找到一 ...

  4. CentOS 7.9 Related Software Directory

    一.CentOS 7.9 Related Software Directory Installing VMware Workstation Pro on Windows Installing Cent ...

  5. 两个行内元素在一起,会出现一定的间距,即使将border、padding、margin都设置为零也无济于事,那么怎么才能去除这些间距呢?

    首先这里的div设置为了行内块元素,span本身为行内元素,并且设置了* {padding: 0; margin: 0;},那怎么清除元素之间的空白缝隙呢?? (1)给元素加浮动 <!DOCTY ...

  6. 栈溢出漏洞利用流程——以syncbrs为例

    0x1 缓冲区溢出漏洞攻击简介 缓冲区溢出攻击是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序的堆栈,使程序转而执行其他指令,以达到攻击 ...

  7. spalsh安装及简单使用

    selenium是浏览器测试自动化工具,很容易完成鼠标点击,翻页等动作,确定是一次只能加载一个页面,无法异步渲染页面,也就限制了selenium爬虫的抓取效率. splash可以实现异步渲染页面,可以 ...

  8. Pytest学习

    pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高. 使用介绍 编写规则 测试函数以t ...

  9. EBI、DDD及其演变架构史

    一.引子 聊架构总离不开"领域驱动架构",大多能聊到DDD(Domain-Driven Design),实际上早期思想EBI架构 1992年就诞生了.核心价值点在于:关注核心业务领 ...

  10. [CS61A] Lecture 1&2&3. Introduction&Functions&Control

    [CS61A] Lecture 1&2&3. Introduction&Functions&Control 前言 CS61A是加州大学伯克利分校一门计算机专业课程,用于 ...