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. 设计模式常用的UML图------类图

    关系 UML将事物之间的联系归纳为6种,对应响应的图形 关联 定义:表示拥有的关系,具有方向性,一个类单向访问一个类,为单向关联.两个类可以相互访问,为双向关联. 聚合 定义:整体与部分的关系. 组合 ...

  2. Aspose.Words 操作 Word 画 EChart 图

    使用 Aspose.Words 插件在 Word 画 EChart 图 使用此插件可以画出丰富的 EChart 图,API 参考 https://reference.aspose.com/words/ ...

  3. C++ Undefined Behavior 详细列表

    Undefined Behavior,即未定义的行为,指程序不可预测的执行效果,一般由错误的代码实现引起.出于效率.兼容性等多方面原因,语言标准不便于定义错误程序的明确行为,而是将其统称为" ...

  4. POC、EXP、SRC概念厘清

    「POC」 POC可以看成是一段验证的代码,就像是一个证据,能够证明漏洞的真实性,能证明漏洞的存在即可.     https://zhuanlan.zhihu.com/p/26832890 「EXP」 ...

  5. 一个实用的 vite + vue3 组件库脚手架工具,提升开发效率

    无论是 vue2 全家桶还是 vue3 + vite + TypeScript,组件库的使用几乎大家都会,但自己开发一个独立组件库就不是每个人都掌握的,因为搭建组件库的基础开发环境,就会让很多同学望而 ...

  6. 【lwip】08-ARP协议一图笔记及源码实现

    目录 前言 8.1 IP地址与MAC地址 8.2 ARP协议简介 8.3 ARP协议报文 8.4 ARP缓存表 8.4.1 ARP缓存表简介 8.4.2 LWIP中的缓存表 8.4.3 ARP缓存表数 ...

  7. CSS 动画一站式指南

    CSS 动画一站式指南 目录 CSS 动画一站式指南 1. CSS 动画 1.1 变换 1.1.1 变换属性介绍 1.1.2 变换动画实践 1.2 过渡 1.2.1 过渡属性介绍 1.2.2 过渡动画 ...

  8. Android ViewHolder

    Adapter :适配器,因为 ListView 是一个 View ,不能添加子项,因此在呈现数据的时候就需要某种工具将数据呈现在 ListView 上,而 Adapter 就能充当此角色.常用的 A ...

  9. RabbitMq简单模式

    RabbitMq简单模式 定义一个生产者,负责发送消息到队列中 /** * @author zjh * 生产者发信息 */ public class Producer { /** * 队列名称 */ ...

  10. 2022-11-11 Acwing每日一题

    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我会认真改正的.同时也希望 ...