《Effictive C++》读书笔记(一)

[Effective modern cpp]现代c++区别 读书笔记创建对象时使用()和{}的区别空指针优先选用nullptr,而非0或null 创建对象时使用()和{}的区别 1、大括号可以指定容器的初始内容>。 std::vector<int> v{1,3,5} 2、大括号可以用来为非静态成员指定默认初始化值,也可以用’='的初始化语法,不能用()。 class Widget{ ... private: int x{0};/... 阅读详情

一.让自己习惯C++


1.      视C++为一个语言集合:

C语言基础,面向对象部分,Template,STL。C++感觉好博大精深,现在貌似还是第二个阶段,想起刚学C++那会儿,一直用着C++的语法,写着面向过程的代码,实在是囧啊…


2.      尽量以const ,enum,inline替换#define:

a)        当我们定义一个常量时,最好使用const常量,而非#define,因为define会无脑的替换,这个常量可以是专属于某处的,而#define所定义的是全局的。

b)        使用enum类似于#define,但是效果更好,而且enum也可以作为int类型的变量使用。

c)        有时候我们会用#define来定义一个函数,这样做很方便而且没有调用函数的开销,但是这样的函数很容易出问题。而我们使用inline函数,加上模板可以更好地的实现这种效果。

d)        虽然#define可以被这么多种东西替代,但是#define还是必不可少的。#ifndef/#ifdef更是对编译流控制的好方法。


3.      尽可能地使用const:

a)        防止意外修改不该被修改的内容,使之尽早在编译时暴露出来。Const可以修饰任何对象,函数参数,函数返回类型,成员函数本体

b)        对于成员函数,如果不希望其改变对象,可以声明为const的。

c)        const版本和non-const版本的成员函数实现等价时,可以令non-const版本的调用const版本的,使用const_cast去除const即可。


4.      保证对象在使用前被初始化:

a)        在使用对象或者变量前,保证其被初始化,防止其为随机值。

b)        对于类的构造函数,最好使用成员初值列表(member initialization list)来初始化,初值列的成员变量排列次序与声明次序相同(这个不是强制,但是最好如是执行,比如我们申请一个数组,数组大小需要先有初值才行)。而不要用构造函数内进行赋值操作(assignment),这样会先默认初始化再赋值,相当于两次操作。

c)        跨编译单元的初始化顺序,以local static对象替换non-local-static对象。说实话这条没看懂...不过我的简单理解就是类似单例模式,我们在使用对象时,有时候不确定初始化的时机,那么我们不如在使用前,将要用的东东一起初始化了。这样就可以控制顺序了。


二.构造,析构,赋值运算


5.了解C++默默编写并调用了哪些函数

a)      如果我们什么都不写的话,编译器也会为我们生成默认构造函数,析构函数,拷贝构造函数,以及一个赋值运算符。

b)      如果我们自己声明了这些函数,那么C++会使用我们自己编写的这些函数,不会再使用那些默认的。

c)      编译器为我们生成的默认构造函数是没有参数的,如果我们声明了其他的有参数的构造函数,那么这个默认构造函数也会消失,我们如果仍想要无参数的构造函数,那么就要自己再声明一个。

d)      编译器为我们生成的析构函数,不会是virtual的,除非这个类的基类有virtual析构函数。


6.若明确不想使用编辑器自动生成的函数,就应该明确拒绝

a)有时候我们不容许拷贝或者赋值一个对象时,即使我们不写拷贝或者赋值函数,编译器也会为我们生成一个,肿么办呢?答案是自己写一个private的拷贝构造函数和赋值函数,这样从类外就不能调用了。但是从类内还是可以调用的,这时候,我们可以只声明,而不定义,这样,即使有人不小心使用了,在编译链接的时候,也会报错。把错误提前暴露,才容易发现。

b)如果我们怕忘记,或者为了方便,也可以定义一个基类uncopyable,让我们的类继承这个类即可。


7.为多态基类声明虚析构函数:

a)      如果我们不这样做,当使用基类指针控制子类对象时,当析构时会发生只析构基类部分,而子类部分不被释放的尴尬情况。导致内存泄露。

b)      但是这也不代表着为了保险起见,我们全都要用virtual析构函数,因为虚函数的开销是比较大的,所以一般判定需要使用虚析构函数的条件为:只要这个类中有一个其他的虚函数,那么就使用虚析构函数。

c)      既然要使用多态的特性,那么如果基类不是虚析构函数,那我们就不要去继承这个类,不然会引出一大串麻烦。比如string,标准stl等都是非虚析构函数的!(前提是使用多态特性)

d)      析构函数调用的顺序:基类的析构函数先调用,然后依次向下调用子类的析构函数。


8.别让异常逃离析构函数:

a)      我的理解感觉就是,能不抛出异常的,或者感觉会抛出异常的功能,不要放在析构函数中,额外设置一个函数。比如.close()关闭函数。但是,在析构函数中仍然要做一下关闭的操作,防止客户忘记调用close发生异常。但是,在析构函数中的异常,不要抛出,可能会导致程序提前结束。应该在析构函数中就catch并处理。

b)      被析构函数调用的函数如果抛出异常,析构函数也应该catch掉,保证不要再抛出。

c)      如果客户需要对某个操作函数运行期间的异常做出反应,那么最好提供一个普通函数,而不要把这个东东放在析构函数中。


9.绝不在构造和析构函数中调用virtual函数:

a)      我们知道,如果有继承,构造函数会先调用父类构造函数,而如果构造函数中有虚函数,此时子类还没有构造,所以此时的对象还是父类的,不会触发多态。更容易记的是基类构造期间,virtual函数不是virtual函数。

b)      析构函数也是一样,子类先进行析构,这时,如果有virtual函数的话,子类的内容已经被析构了,C++会视其父类,执行父类的virtual函数。

c)      总之,在构造和析构函数中,不要用虚函数。如果必须用,那么分离出一个Init函数和一个close函数,实现相关功能即可。


10.令operator=返回一个referenceto *this:

我们经常会为我们的类写一个operator=的函数,为了保证连锁赋值,比如x= y=z的这种情况能正常执行,最好是返回一个*this的引用。


11.在operator=中处理“自我赋值”:

a)      自我赋值看起来不是那么容易发生,但是程序复杂了什么情况都有,所以为了我们程序的健壮性,还是要处理一下的。

b)      自我赋值会导致程序出错的情况在于,如果字段中有指针,先删除指针原来指向的对象,指向=右边的对象。而自我赋值时会导致原来的对象被删除,而=右边的对象也被删除,因而会出错。

c)解决的方法其实最简单的就是先判定是否相等,如果和自己是同一个对象,直接返回*this,结束。


12.复制一个对象时勿忘其每一个成分:

a)      正常情况下,如果我们不写拷贝构造函数,编译器会为我们生成一个默认的拷贝构造函数,但是这个函数只能实现浅拷贝,如果要实现深拷贝就必须要自己写一个拷贝构造函数。

b)      但是如果我们自己写了拷贝构造函数,就一定要拷贝每一个成分,如果忘记了某个成分,编译器是不会提醒的。尤其在发生继承的时候,更加需要注意拷贝基类成员部分。通过调用基类函数来进行拷贝。

c)      关于initialization和assignment:前者由构造函数执行,后者由operator =执行。两者对应不同的函数动作。两者可能有差不多的内容,但是不要使用一个调用另一个函数,如果实在想要抽象,不如提取一个Init函数。

Effective C++中文版第三版 高清PDF带目录 立即下载

相关推荐

基于Qt实现的轻量级CAD画图软件

基于Qt开发的轻量级CAD应用程序

weixin_44954230的博客 5658

EFFECTIVE C++ (万字详解)(一)

前言: effective C++ 是一本经典之作,其翻译较为贴合原著,但读起来未免有些僵硬而让人摸不着头脑,所以,我会以更为贴近中国人的理解,对此书进行一些阐释。 条款01:把 C++ 看成一个语言联邦 C++由几个重要的次语言构成 C语言:区块,语句,预处理器,数组,指针等等。 类:class,封装,继承,多态......(动态绑定等等) 模板:涉及泛型编程,内置数种可供套用的函数或者类。 STL:STL是个模板库,主要涉及容器,算法和迭代器 在不同情况下使用适合的部分,可以使 C++

qq_62674741的博客 1万+

应急响应之windows日志分析工具logparser使用

windows日志分析工具logparser使用介绍

u013930899的博客 8123

C++笔记

C++笔记 一.c++基础 1.第一个程序 首先学习了用C++编写第一个程序HelloWorld #include<iostream> using namespace std; int main() { cout << "Hello World!" << endl; system("pause");//按任意键继续 return 0; } 2.注释 #include<iostream> using namespace std; /

weixin_51290359的博客 1724

绕开华为通道,获取解锁码解锁BootLoader

刷机有风险,操作需谨慎,如果因为各种因素导致手机变砖无法开机,本教程概不负责,望悉知 前言 这篇文章的大多内容是根据我自己找的一篇文章《绕开华为通道,获取解锁码解锁BootLoader》来编写的,里面的大部分内容是文章的原内容。下面的都是我参考文章中做了一些小部分的修改,增加了我华为P8手机的一些操作,下面开始讲述我的解锁过程。 因为华为官方在2018年的七八月份吧,关闭了解锁码的申请通道,这...

Martin.Mu `s Special Column 5万+

STM32实战篇:使用USART发送/接收数据

在发送字符时也可以直接使用其对应的ASCLL码,例如: USART_SendData(USART1, 0x61);

qq_74114817的博客 596

C++学习笔记(1)基础部分

C++学习笔记一 .C与C++区别1.1 constconst与指针1.2 引用(别名)*引用与const1.2 默认值参数1.3 内联函数1.4 函数重载1.2.1 C与C++函数的互相调用1.5 函数摸板数组引用与函数模板1.6 new与malloc1.7命名空间1.8 右值引用*右值引用与将亡值右值引用的应用移动赋值与移动拷贝右值引用与函数模板二.面向对象2.1 面向对象2.2 this 指针const与成员方法2.3构造函数构造函数的类型转化拷贝构造函数2.4析构函数友元=运算符重载()运算符重载缺

qq_53307983的博客 6414

基于截图详解:SAP GUI for Java 如何设置登录链接,以及 conn= 连接字符串该怎么写

摘要:SAP GUI for Java 的连接属性配置关键是在"高级"页签的"conn="后填写连接字符串。连接字符串格式取决于网络拓扑:直连应用服务器使用"/H/主机/S/端口";通过消息服务器负载均衡使用"/M/消息服务器/S/端口/G/组名";经SAProuter访问则需添加路由器前缀。配置时需注意专家模式会覆盖其他页签设置,且连接字符串还支持附加参数如客户端、语言和默认事务码。具体填写内容应根据Basis团队提供的系统信

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 250

【C++】万字详解Effective C++

本文为前段时间读《Effective C++》(侯捷译)时做的个人笔记。

Friday 4289

【OpenCV实战】简洁易懂的车牌号识别Python+OpenCV实现“超详解”(含代码)

简洁易懂的车牌号识别Python实现(含代码)1、整体思路2、代码详解 1、整体思路 2、代码详解

qq_40784418的博客 9万+

Unity 实战项目 ☀️| 只用一个脚本做一个 刮刮乐 案例,一不小心刮出来一个女朋友!【学习娱乐一下】

只用一个脚本做一个刮刮乐,一不小心刮出来一个女朋友!【学习娱乐一下!】

努力前行,总会成为自己心中的那道光 23万+

【C++】C++学习笔记

所谓数组,就是一个集合,里面存放了相同类型的数据元素特点1:数组中的每个==数据元素都是相同的数据类型==**特点2:**数组是由==连续的内存==位置组成的数据类型 数组名[ 数组长度 ];数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};数据类型 数组名[ ] = { 值1,值2 ...};示例//定义方式1//数据类型 数组名[元素个数];//利用下标赋值//利用下标输出//第二种定义方式。

xifan的博客 7918

GVINS数据采集(u-blox fp9 + D435i)

1、配置千寻的RTK账号 采集数据当天购买千寻的RTK账号,然后在Window下,输入账号和密码 (具体的步骤如之前面连接所示),查看u-center软件上的信息,确保接收机可以收到RTK信息; 2、查看Linux系统下u-blox是否可以正常接受GPS信号和RTK数据流 1、GPS信号信息 // 打开端口 1 cd ublox_f9p/src // 或者在终端1下也可以 source devel/setup.bash r.....................

努力努力努力 2609

Effictive C++ 3rd 读书笔记:序

C++ 三部曲的第一部,by Scott Meyers

Daemon09080的博客 482

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Effictive C++ 3rd 读书笔记:自己习惯 C++ 01

C++ 三部曲的第一部,by Scott Meyers

Daemon09080的博客 767

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Effictive C++读书笔记

都是一些简单的总结,可以帮助回忆当时看书的知识点~ 一.让自己习惯C++条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言: • C。说到底C++仍是以C为基础。区块,语句,预处理器,内置数据类型,数组,指针统统来自C。 • Object-Oreinted C++。这一部分是面向对象设计之古典守则在C++上的最直接实施。类,封装,继承,多态

爱生活,爱学习 566

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

More Effictive C++读书笔记

都是一些简单的总结,可以帮助回忆当时看书的知识点~ 基础指针与引用的区别1.是否有空值 2.是否能重新赋值 如果你总是想指向一个对象并且一旦指向一个后就不会改变指向,或者重载操作符并为防止不必要的语义误解时,应该用引用 类型转换 1.static_cast:C风格转换,没有继承关系的平级转换,double->int 2.dynamic_cast:继承转换 3.reinterpet_cast

爱生活,爱学习 626

Effective C++ 读书笔记(一)

Effective C++ 读书笔记(一) 1、让自己习惯C++ 条款 01 :视C++为一个语言联邦 C++的四个层次: C:C++是在C语言的基础上发展而来的 Object-Oriented C++:这是C++中不同于C的部分,这里主要指面向对象。 Template C++:C++中的泛型编程。 STL:这是一个标准模板库,它用模板实现了很多容器、迭代器和算法,使用STL往往事半功倍。 条...

qq_40028201的博客 1011

Effictive c++读书笔记七——条款38-40

条款38:通过复合塑模树has-a 或“根据某物实现出” 复合(composition)是类型之间的一种关系,一个类型的对象包含其他类型对象便是这种关系: class Address{ …… }; class PhoneNumber{ …… }; class Person{ public: …… private: std::string name; Address

小李的专栏 634

Effictive STL读书笔记

都是一些简单的总结,可以帮助回忆当时看书的知识点~ ##第1条:慎重选择容器类型 STL容器的分类远比我想像中的多。别人意外的是stack,queue等不是STL容器,但这不是这章的重点。 你是否需要在容器的任意位置插入新元素?如果是,就选择序列容器。‘ 你是否关心容器中的元素是如何排序的?如是不关心,哈希容器是一个可能的选择;否则,你要避免哈希

爱生活,爱学习 506

effective c++读书笔记

effective c++读书笔记一级目录二级目录三级目录Charpter 1. 让自己习惯C++条款01: 视C++为一个语言联邦条款02: 尽量以const,enum,inline替换#define条款03: 尽可能使用const条款04: 确定对象被使用前已先被初始化Charpter 2. 构造/析构/赋值运算条款05: 了解C++默默编写并调用哪些函数条款06: 若不想使用编译器自动生成的函数,就该明确拒绝条款07: 为多态基类声明virtual析构函数条款08: 别让异常逃离析构函数条款09: 绝

cwdben的博客 548

Effective C++ 读书笔记 Item55 熟悉一下Boost

Boost是一个C++开发者的社区,作为C++标准的试验场, 收容了很多高质量、开源的、跨平台、独立于编译器的C++库, 包括许多TR1组件的实现。 Boost是其他C++组织和社区所不能比拟的: 与C++标准委员会的亲近关系。Boost社区成员和C++标准委员会成员有很大的交集。 多数C++下一代标准都来自于Boost社区。 特殊的项目接收流程。首先在邮件列表中提出它,然后开启整个流程: ...

Vermont_的博客 252

Effective C++------读书笔记

(一)让自己习惯C++ (1)条款01:视C++为联邦语言 C++的组成可分为四部分: 1.C:C++仍然以C语言为基础。区块、语句、预处理、内置数据类型、数组、指针等都来自C。 2.Object-Oriented C++:C with Classes所诉说的:classes(包括构造和析构)、封装、继承、多态、virtual动态绑定等 3.Template C++:泛型编程 4.STL

come_on_xueRong的博客 550

《More Exceptional C++》读书笔记

在本书中,Herb Sutter采用了独具匠心的“提问/解答”的方式来指导你学习C++的语言特性;在本书的每个专题中,HerbSutter合理地设想出你的疑问和困惑,又有如神助地猜到了你的(可能是错误的)解答,然后给你以指点并呈现出最佳方案,最后,还提炼解决类似问题的一般性原则。 本书适合的读者对象是中高级程序员,尽管如此,只要具备基本的C++功底和一定的程序设计经验,你完全可以理解和消化本书的

backard的专栏 687

Effective C++ 读书笔记 Item42 typename的两种用法

时至今日还有人在论坛里问模板参数前的typename和class有何区别: template<typename T> class Widget; template<class T> class Widget; 答案是没有区别!有人觉得class写起来方便就用class,有人觉得typename语义更正确就用typename。 然而typename和class对编译器而...

Vermont_的博客 319

effective C++ 读书笔记 条款11

在operator=当中处理“自我赋值”

CppPlayer 1684
上一篇: Direct-X学习笔记--纹理映射进阶
下一篇: Direct-X学习笔记--公告板
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值