《Effective C++》构造、析构、赋值运算
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++》构造、析构、赋值运算的更多相关文章
- Effective C++ —— 构造/析构/赋值运算(二)
条款05 : 了解C++默默编写并调用哪些函数 编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 1. default构造函 ...
- Effective C++ -- 构造析构赋值运算
05.了解C++默默编写并调用哪些函数 编译产生的析构函数时non-virtual,除非这个类的基类析构函数为virtual 成员变量中有引用和const成员时,无法自己主动生成copy assign ...
- 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- EffectiveC++ 第2章 构造/析构/赋值运算
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 2 构造 / 析构 / 赋值 条款 05:了解C++ ...
- Effective C++ 笔记二 构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数 编译器默认声明一个default构造函数.一个copy构造函数.一个copy assignment操作符和一个析构函数.这些函数都是public且inlin ...
- Effective C++笔记:构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...
- Effective C++笔记(二):构造/析构/赋值运算
参考:http://www.cnblogs.com/ronny/p/3740926.html 条款05:了解C++默默编写并调用哪些函数 如果自定义一个空类的话,会自动生成默认构造函数.拷贝构造函数. ...
- 【Effective C++】构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...
- Effective C++ 2.构造 析构 赋值运算
//条款07:为多态基类声明virtual析构函数 // 1.若基类的析构函数不定义为虚函数,由于基类的指针或引用可以指向派生类的对象,则在删除基类对象的时候可能会出错,导致破坏数据结构. // 2. ...
随机推荐
- 创建Vue工程常用的命令
创建一个vue项目的步骤 1.创建一个名称为myapp的工程 vue init webpack myapp 2.进入工程目录 cd myapp 3.安装 vue-router npm install ...
- 齐博x1.1用户登录接口
用户的登录主要涉及到小程序登录.APP的帐号密码登录.APP的微信开发平台帐号登录.相应的地址是:http://qb.net/index.php/index/wxapp.login/index.htm ...
- letcode刷题记录-day03-罗马转整数
题目 罗马转整数 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 ...
- R数据分析:孟德尔随机化实操
好多同学询问孟德尔随机化的问题,我再来尝试着梳理一遍,希望对大家有所帮助,首先看下图1分钟,盯着看将下图印在脑海中: 上图是工具变量(不知道工具变量请翻之前的文章)的模式图,明确一个点:我们做孟德尔的 ...
- 关于C#Section配置未初始化的问题
转载 https://www.cnblogs.com/lxshwyan/p/10828305.html 如果使用了configSection节点,则configSection必须位于根节点的第0个.A ...
- MSP430中断小实验——通过按键改变小灯闪烁频率
本小实验基于MSP430f5529,不同的型号可能管脚和中断配置有所不同. 实现的功能为: 第一次按下按键后,系统以每 2 秒钟,指示灯暗 1 秒,亮 1 秒的方式闪烁.程序采用默认时钟配置: 第二次 ...
- vulnhub靶场之LOOZ: 1
准备: 攻击机:虚拟机kali.本机win10. 靶机:looz: 1,下载地址:https://download.vulnhub.com/looz/Looz.zip,下载后直接vbox打开即可. 知 ...
- DHorse的链路追踪
目前,DHorse的链路追踪功能是通过SkyWalking来实现.实现原理是DHorse在部署应用时,通过指定SkyWalking的Agent来收集服务的调用链路信息.下面就来具体看一下DHorse如 ...
- 2.10:数据加工与展示-pandas清洗、Matplotlib绘制
〇.目标 1. 使用pandas完成基本的数据清洗加工处理: 2. 使用Matplotlib进行简单的数据图形化展示. 一.用pandas清洗处理数据 1.判断是否存在空值 数据缺失在很多数据中存在, ...
- 干货 | 如何快速实现 BitSail Connector?
简介 本文面向 BitSail 的 Connector 开发人员,通过开发者的角度全面的阐述开发一个完整 Connector 的全流程,快速上手 Connector 开发. 目录结构 首先开发者需要通 ...