Effective C++ [ 读书笔记 ] 整理 1 - 12/55

effective c++读书笔记 effective c++读书笔记和总结 effective c++读书笔记和总结 立即下载
有人说C++程序员可以分为两类,读过Effective C++的和没读过的。世界顶级C++大师Scott Meyers 成名之作的第三版的确当得起这样的评价。
本书并没有你告诉什么是C++语言,怎样使用C++语言,而是从一个经验丰富的C++大师的角度告诉程序员:怎么样快速编写健壮的,高效的,稳定的,易于移植和易于重用的C++程序。
本书共分为9节55个条款,从多个角度介绍了C++的使用经验和应遵循的编程原则。
本系列文章分两部分概括介绍了《Effective C++》每个条款的核心内容,本文是第一部分,第二部分为:《Effective C++》读书笔记(第二部分)。
1. 让自己习惯C++(Accustoming your self to C++)
条款01: 视C++ 为一个语言联邦
本条款提示读者,C++已经不是一门很单一的语言,而应该将之视为一个由相关语言组成的联邦。从语言形式上看,它是一个多重范型编程语言(multiparadigm programminglanguage) ,一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional) 、泛型形式(generic) 、元编程形式(metaprogramming )的语言,从语言种类上看,它由若干次语言组成,分别为:
(1) C。说到底C++ 仍是以C 为基础。区块(blocks) 、语句( statements) 、预处理器( preprocessor) 、内置数据类型(built-in data types) 、数组(arrays) 、指针(pointers) 等统统来自C。
(2) Object-Oriented C++。这部分也就是C with Classes 的: classes (包括构造函数和析构函数) ,封装( encapsulation) 、继承( inheritance) 、多态(polymorphism) 、virtual 函数(动态绑定) ……
(3) Template C++。这是C++ 的泛型编程(generic programming) 部分,也是大多数程序员经验最少的部分。Template 相关考虑与设计己经弥漫整个C++,实际上由于templates 威力强大,它们带来崭新的编程范型(programming paradigm) ,也就是所谓的templatemetaprogramming (TMP,模板元编程)
(4) STL。 STL 是个template 程序库,它是非常特殊的一个。它对容器(containers) 、迭代器(iterators) 、算法(algorithms) 以及函数对象(function objects) 的规约有极佳的紧密配合与协调。

条款02: 尽量以const, enum, inline替换#define
本条款讨论了C语言中的#define在C++程序设计中的带来的问题并给出了替代方案。
C语言中的宏定义#define只是进行简单的替换,对于程序调试,效率来说,会带来麻烦,在C++中,提倡使用const,enum和inline代替#define;然而,有了consts 、enums 和inlines,我们对预处理器(特别是#define) 的需求降低了,但并非完全消除。#include 仍然是必需品,而#ifdef/#ifndef 也继续扮演控制编译的重要角色。目前还不到预处理器全面引迫的时候。

条款03: 尽可能使用const
本条款总结了Const的使用场景和使用它带来的好处。
关键字canst 多才多艺。你可以用它在classes 外部修饰global 或namespace作用域中的常量,或修饰文件、函数、或区块作用域(block scope) 中被声明为static 的对象。你也可以用它修饰classes 内部的static 和non-static 成员变量。面对指针,你也可以指出指针自身、指针所指物,或两者都(或都不〉是const。你应该尽可能地使用const,这样降低程序错误,使程序易于理解。
此外,一个编程技巧是:当const 和non-const 成员函数有着实质等价的实现时,令non-const 版本调用const 版本可避免代码重复:
classTextBlock {
public:
    const char& operator[] (std::size_tposition) const {
        //……
        returntext[position];
    }
    char& operator[] (std::size t position)  {
        return const_cast<char&>(static_cast<constTextBlock&>(*this) [position]);
        //将op[]返回值的const 转除为*this 加上cons, 调用const op[]
    }
}
条款04: 确定对象被使用前已先被初始化
本条款告诫程序员,在C++程序设计中,应该对所有对象初始化,以避免不必要的错误,同时,给出了高效初始化对象的方法和正确初始化对象的方法。
(1)初始化构造函数最好使用成员初值列(member initialization list) ,而不要在构造函数本体内使用赋值操作(assignment) 。初值列出的成员变量,其排列次序应该和它们在class 中的声明次序相同。
考虑一个用来表现通讯簿的class ,其构造函数如下:
C++ 有着十分固定的”成员初始化次序。次序总是相同: base class早于其derived classes 被初始化,而class 的成员变量总是以其声明次序被初始化。回头看看ABEntry. 其theName 成员永远最先被初始化,然后是theAddress,再来是thePhones,最后是numTimesConsulted。即使它们在成员初值列中以不同的次序出现(很不幸那是合法的),也不会有任何影响。
(2)C++ 对”定义于不同编译单元内的non-local static 对象”的初始化次序并无明确定义。为免除”跨编译单元之初始化次序”问题,请以local static 对象替换non-local static 对象。
2. 构造/析构/赋值运算(Constructors,Destructors,and Assignment Operators)
classFileSystem { ... };
FileSystem& tfs() {//代替tfs对象
    staticFileSystem fs; // 以local static的方式定义和初始化object
    returnfs; // 返回一个引用
}
classDirectory { ... };
Directory::Directory( params )  {
    // ...
    std::size_tdisks = tfs().numDisks();
    // ...
}
Directory& tempDir() {// 代替tempDir对象,
    staticDirectory td;
    returntd;
}
条款05: 了解C++ 默默编写并调用哪些函数
本条款告诉程序员,编译器自动为你做了哪些事情。
用户定义一个empty class (空类),当C++ 处理过它之后,如果你自己没声明,编译器就会为它声明(编译器版本的)一个copy 构造函数、一个copy assignment操作符和一个析构函数。此外如果你没有声明任何构造函数,编译器也会为你声明一个default 构造函数。所有这些函数都是public 且inline 。举例,如果你写下:
classEmpty { };
这就好像你写下这样的代码:
classEmpty {
public:
    Empty() { ... }
    Empty(constEmpty& rhs) { ... )
    ~Empty( ) { ... }
    Empty& operator=(constEmpty& rhs) { ... }
};

需要注意的是,只要你显式地定义了一个构造函数(不管是有参构造函数还是无参构造函数),编译器将不再为你创建default构造函数。

条款06: 若不想使用编译器自动生成的函数,就该明确拒绝
本条款告诉程序员,如果某些对象是独一无二的(比如房子),你应该禁用copy 构造函数或copy assignment 操作符,可选的方案有两种:
(1) 定义一个公共基类,让所有独一无二的对象继承它,具体如下:

classUncopyable {
protected ://允许derived对象构造和析构
    Uncopyable() {}
    ~Uncopyable() {}
private:
    Uncopyable(constUncopyable&); //但阻止copying
    Uncopyable& operator=(constUncopyable&);
};
为阻止HomeForSale对象被拷贝,唯一需要做的就是继承Uncopyable:
classHomeForSale : privateUncopyable {
  //…
};
这种方法带来的问题是,可能造成多重继承,这回导致很多麻烦。
(2) 创建一个宏,并将之放到每一个独一无二对象的private中,该宏为:
// 禁止使用拷贝构造函数和 operator= 赋值操作的宏
// 应该类的 private: 中使用
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(constTypeName&); \
void operator=(const TypeName&)
这种方法比第一种方法好,google C++编程规范中提倡使用该方法。

条款07: 为多态基类声明virtual 析构函数
本条款阐述了一个程序员易犯的可能导致内存泄漏的错误,总结了两个程序员应遵守的百编程原则:
(1)polymorphic (带多态性质的) base classes 应该声明一个virtual 析构函数。如果
class 带有任何virtual 函数,它就应该拥有一个virtual 析构函数。这样,但用户delete基类指针时,会自动调用派生类的析构函数(而不是只调用基类的析构函数)。
(2)Classes 的设计目的如果不是作为base classes 使用,或不是为了具备多态性(polymorphically) ,就不该声明virtual 析构函数。这是因为,当用户将一个函数声明为virtual时,C++编译器会创建虚函数表以完成动态绑定功能,这将带来时间和空间上的花销。

条款08: 到让异常逃离析构函数
(1)析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。
(2)如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class 应该提供一个普通函数(而非在析构函数中)执行该操作。

条款09: 绝不在构造和析构过程中调用virtual 函数

条款10: 令operator= 返回一个reference to *this
本条款告诉程序员一个默认的法则:为了实现“连锁赋值“,应令operator= 返回一个reference to *this。

条款11: 在operator= 中处理”自我赋值”
本条款讨论了几种编写复制构造函数的正确方法。给出的结论是:确保当对象自我赋值时operator= 有良好行为。其中技术包括比较”来源对象”和”目标对象”的地址、精心周到的语句顺序、以及 copy-and-swap。
(1) 复制操作符的一种编写方式如下:
Widget& Widget::operator=(constWidget& rhs) {
    if(this == &rhs) return *this; //判断是否为同一个对象,如果是自我复制,直接返回
    delete pb;
    pb = new Bitmap(*rhs.pb);
    return *this;
}
这个版本存在异常方面的麻烦,即,如果”new Bitmap” 导致异常(不论是因为分配时内存不足或因为Bitmap 的copy构造函数抛出异常) , Widget 最终会持有一个指针指向被删除的Bitmap 。
(2) 让operator= 具备”异常安全性”往往自动获得”自我赋值安全”的回报。因此愈来愈多人对”自我赋值”的处理态度是倾向不去管它,把焦点放在实现”异常安全性” (exception safety) 上,即:
widget& Widget::operator=(constWidget& rhs) {
  Bitmap* pOrig = pb;
  pb = new Bitmap(*rhs.pb);
  delete pOrig;
  return *this;
}
如果”newBitmap” 抛出异常, pb (及其栖身的那个Widget) 保持原状。即使没有证同测试(identity test) ,这段代码还是能够处理自我赋值,但这种方法效率比较低。
(3) 另外一种比较高效的方法是:
classWidget {
  //……
  void swap(Widget& rhs); //交换*this 和rhs 的数据:详见条款29
  //……
};
Widget& Widget::operator=(Widget rhs) {//rhs是被传对象的一份复件(副本),注意这里是pass by value.
  swap(rhs);//将*this 的数据和复件/副本的数据互换
  return *this;
}
条款12: 复制对象时勿忘其每一个成分
本条款阐释了复制对象时容易犯的一些错误,给出的教训是:
(1) Copying 函数应该确保复制”对象内的所有成员变量”及”所有base class 成分”。
(2) 不要尝试以某个copying 函数实现另一个copying 函数。应该将共同机能放进第三个函数中,并由两个coping 函数共同调。
换句话说,如果你发现你的copy 构造函数和copy assignment 操作符有相近的代码,消除重复代码的做法是,建立一个新的成员函数给两者调用。
这样的函数往往是private 而且常被命名为init。

5G-A无源物联网:深度解析“不插电“智能的底层技术原理 北京移动推出5G-A无源物联网技术,实现电动车标签"零功耗"运行。该技术通过射频能量收集(利用5G-A基站高功率信号转换为电能)和反向散射通信(调制反射信号传输数据)两大核心技术,使设备无需电池即可工作。5G-A相比4G在信号能量密度、通信速率和定位精度等方面显著提升,结合通感一体等创新技术,为无源物联网提供商用基础。该方案已在北京小区试点应用,实现电动车精准定位管理,标签寿命可达5年以上。专家预测,这项技术将大幅降低物联网部署成本,推动"万物智联"时代的到来。 阅读详情

相关推荐

【VisionMaster】图像源模块之本地图像

图像采集之图像源

zhy29563 6959

《Effective C++》读书笔记(一):让自己习惯C++(条款01~04)

读《Effective C++》第一章:让自己习惯C++ 而写的总结笔记,从条款01到条款04.

wjmhlh的博客 504

【JESD79-5之】8 AC & DC 输入测量标准(AC & DC Input Measurement Levels)

时钟被驱动到DRAM,可以通过L/RDIMM模块的RCD来实现,也可以通过U/SODIMM模块的主机来实现(图184)。接收机DQS(脉冲)输入电压灵敏度测试提供了在没有码间干扰(ISI),抖动(Rj, Dj, DCD)和串扰噪声的情况下测试接收机对不同输入电压的灵敏度的方法。接收机数据输入电压灵敏度测试提供了在没有符号间干扰(ISI),抖动(Rj, Dj, DCD)和串扰噪声的情况下测试接收机对不同输入电压的灵敏度的方法。

m0_61126667的博客 1705

Effective C++读书笔记

Effective C++读书笔记 条款1:尽量用const和inline而不用#define 1.为方便调试,最好使用常量 注意:常量定义一般放在头文件中,可将指针和指针所指的类型都定义成const,如const char * const authorName = Scott Meyers; 类中常量通常定义为静态成员, 而且需要先声明后定义可以在声明时或定义时赋值,也可使用借用enum的方法如enum{Num = 5}; 2.#define语句造成的问题 如#define max(a, b...

一蓑烟雨任平生 393

特征提取 Features Extraction

介绍了特征提取的基本概念,从分类变量,文本信息和图片信息中进行特征提取的方法,以及实现特征提取的类库

JasonH2021的博客 1万+

Excel VBA+Adobe Acrobat Pro PDF发票识别全流程(附避坑指南)

本文详细介绍了如何利用Excel VBA与Adobe Acrobat Pro的API接口,构建一套企业级PDF发票智能识别与处理系统。内容涵盖从环境配置、核心文本提取原理、数据解析清洗到工程化脚本设计的全流程,并针对密码区干扰、不征税发票等常见问题提供避坑指南,旨在帮助财务人员和开发者实现高效、精准的财务数据处理自动化。

weixin_29207439的博客 348

《Effective C++》读书笔记

一、让自己习惯C++ 1、视C++为一个语言联邦 1、对内置对象类型而言,pass_by_value比pass_by_reference更高效。对用户自定义对象类型而言,pass-by-reference-to-const往往更好。 2、尽量以const、enum、inline替换#define 3、尽可能使用const 1、如果const出现在星号左边,表示被指物是常量,如果const...

聆听风雨的博客 1613

疾风气象大模型4.0白皮书

《疾风气象大模型白皮书摘要》 疾风气象大模型(J-AFM)是国内首个基于3D建模的气象智能平台,突破传统二维气象分析的局限,采用体素化技术构建"x-y-z-t"四维统一模型,实现从分钟级短临到30天跨时效的连续预测。核心技术包括:1)多源数据三维同化,融合雷达、卫星、风廓线等异构数据;2)物理约束AI解码器,嵌入能量守恒、湍流封闭等气象原理;3)行业适配插件,服务风电、光伏、航空等领域,如山地风场尾流校正、云影短临预测。平台支持批流一体推理与边缘部署,提供概率化输出和误差溯源能力,显著降

专注AI大模型,软件混淆,授权 542

Effective-C++阅读笔记

阅读笔记

m0_73976756的博客 1169

cuRobo 入门教程(一)基于CUDA的机器人运动规划加速库

cuRobo是一款基于CUDA加速的机器人算法库,提供运动学计算、碰撞检测、轨迹优化等功能。该库采用并行优化技术,在GPU上实现高效运算,比现有方案快60倍。cuRobo支持多种机器人模型和环境表示,包含正向/逆向运动学、无碰撞轨迹生成、模型预测控制等核心算法,并可与IsaacSim等仿真平台集成。其特点包括:1) 支持多种碰撞检测方式(长方体/网格/深度图像);2) 提供批量环境处理和实时世界更新;3) 通过CUDA Graphs加速优化迭代;4) 在Jetson Orin等平台实现毫秒级运动规划。安装支

2506_90492529的博客 1931

药物相关 PK(药代动力) 、PD(药效)指标知识

PK代表药物的药代动力学,指的是药物在体内的吸收、分布、代谢和排泄等过程,包括药物的药代动力学参数如Cmax(最大血药浓度)、Tmax(最大血药浓度出现的时间)、t1/2(半衰期)、AUC(药物曲线下面积)等。PD代表药物的药效学,指的是药物与生物体相互作用所产生的药理效应,包括药物的药效学参数如EC50(半数最大有效浓度)、ED50(半数最大效应剂量)、Emax(最大效应)等。PD(Pharmacodynamics)则研究药物的药效学特性,如药物的作用机制、效力、最大疗效、最小毒性等。

weixin_42357472的博客 2万+

Effective C++读书笔记(持续更新)

protected:private:​// 为阻止HomeForSale对象被拷贝,需要继承Uncopybale​。

XT3121000506的博客 1648

YOLOv12改进策略【卷积层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov12精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 684

[C/C++] Effective C++ [ 读书笔记 ] 整理 1 - 12/55

有人说C++程序员可以分为两类,读过Effective C++的和没读过的。世界顶级C++大师Scott Meyers 成名之作的第三版的确当得起这样的评价。 本书并没有你告诉什么是C++语言,怎样使用C++语言,而是从一个经验丰富的C++大师的角度告诉程序员:怎么样快速编写健壮的,高效的,稳定的,易于移植和易于重用的C++程序。 本书共分为9节55个条款,从多个角度介绍了C++的使用经验和应

知行天下 976

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

effective c++ 思维导图

历时两个多月的时间,终于把effective c++又复习了一遍,比较慢,看的是英文版,之前看的时候做过一些笔记,但不够详细,这次笔者是从头到尾的翻译了一遍,加了一些标题,先记录到word里面,然后发布到博客园上。这么做是为了方便查阅,复习C++,同时练习英文,希望这些帖子也能够对大家有所帮助。 有人回复说有些过时了,的确,但大部分还都是effectiv...

weixin_34232363的博客 221

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

effective C++读书笔记

常量定义式通常被放在头文件内(以便被不同的源码含入),因此有必要将指针(而不只是指针所指之物)声明为const.例如若要在头文件内定义一个常量的(不变的)char*-based字符串,你必须写const两次:

! 591

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++ | 一文整理Effective C++ 55条款内容(全)

前言 文章目录前言1. 视C++为一个语言联邦2. const、enum、inline3.尽可能使用const4. 确定对象初始化】5. 了解C++默默编写并调用那些函数6. 不自动生成的函数,就明确拒绝7. 多态基类声明virtual析构函数8. 别让异常逃离析构函数9. 不在构造析构过程中调用virtual函数10. operator=返回reference to *this11. operator=处理自我赋值12. 赋值对象勿忘其每一个成分13. 以对象管理资源14. 资源管理类中小心coping

weixin_45926547的博客 5587

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

《Effective C++》读书笔记 条款01:视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分(C, Obejct-Oriented C++, Template C++, STL)。 条款02:尽量以const, enum, inline替换#define 对于单纯常量,最好以const对象或enum替换#define。 对于形似函数的宏,最好改用inline函数代替#define。 条款03:尽可能使用const 将某些东西声明为const可帮助

WINGREZ‘S BLOG 618

【Effective C++】总结整理之3_资源管理

文章目录3.资源管理13.以对象管理资源`auto_ptr`——智能指针`tr1::shared_ptr`——RCSP(reference-counting smart pointer)13总结14 在资源管理类中小心copying行为当一个RAII对象被赋值,会发生什么事情?禁止复制引用计数法——`tr1::shared_ptr`14总结15 在资源管理类中提供对原始资源的访问智能指针显式隐式获取原始资源15总结16 成对使用new和delete时要采取相同形式17 以独立语句将`newed`对象置入智能

weixin_42157432的博客 240

Effective C++ 要点整理(一)

Effective C++ 学习笔记 条款07:为多态基类声明virtual析构函数 C++曾明确指出,当派生类(derived class)对象经由一个基类(base class)指针被删除,而该基类还带着一个non-virtual析构函数,其结果未有定义-实际执行时通常发生的是对象的派生成分没被销毁。而其基类成分通常会被销毁,于是造成一个诡异的“局部销毁”对象。这会造成资源泄露、

ccnnli的博客 646

Effective C++标题整理

Effective C++话说光看这50个tip又有什么用呢?只有实际使用的时候才体现它们的价值才对。就像只看《代码大全》不能成为一个好程序员,必须结合实际写项目经验才行。从C转向C++条款1:尽量使用const和inline而不用#define条款2:尽量用而不用<stdio.h>条款3:尽量用new和delete而不用molloc和free内存管理条款4:尽量使用C++风...

diaomiezuo8055的博客 204

Effective C++ 知识点记录

导读 声明式,定义式,初始化 explict关键字,类的构造函数声明为explict,可以阻止它们被用来执行隐式类型转换。 除非有一个好理由允许构造函数被用于隐式类型转换,否则声明为explictpass-by-value意味着“调用拷贝构造函数“,以值传递

老夫编代码就是一把梭 736

Effective C++ 条款简要梳理

对 Effective C++ 一书中的内容做简要的总结,方便记忆与理解

icky的博客 471

effective c++ 条款02 整理

尽量以const、enum和inline代替#define 一、#define的功能 参考:http://www.crifan.com/_define_detailed/ (1) #define的变体,即#ifndef,可以防止头头文件的重复引用 #ifdef和 #define组合,一般用于头文件中,用以实现防止多个文件对此同一个头文件的重复引用.实际使用中,即使你的头文件暂时没有被多个文

hustyangju的足迹 1537
上一篇: 读书笔记之:Linux程序设计(第4版)(ch1-7) [ 学如逆水行舟,不进则退 ]
下一篇: Realize Php
aclay
博客等级 码龄15年 37粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值