Effective C++读书笔记---让自己习惯C++

本文介绍了C++高效编程的四大核心原则,包括采用多种编程范式、减少预处理器使用、充分利用const特性和确保对象初始化。文章详细解释了如何通过const提高代码质量和效率,并强调了初始化列表的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读
1.做一个有“线程概念”的程序员
一、条款01-视C++为一个语言联绑
1.C++是个多重范型的语言(multiparadigm programming language),一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、泛型形式(generic)、元编程形式(metaprogramming)的语言
2.C++并不是一个带有一组守则的一体语言,它是四个次语言(C/Object-Oriented C++/Template C++/STL)组成的联绑政府,每个次语言都有自己的规约。C++高效编程守则视状况而变化,取决于你使用C++的哪一部分
二、条款02-尽量以const/enum/inline替换#define
1.#define不能够提供任何封装性
2.有了consts/enums/inlines,我们对预处理器(特别是#define)的需求降低了,但并非完全消除。#include仍然是必需品,而#ifdef/#ifndef也继续扮演控制编译的重要

角色。目前还不到预处理器全面引退的时候,但你应该明确地给予它更长更频繁的假期
3.对于单纯常量,最好以const对象或enums替换#define
4.对于形似函数的宏(macros),最好改用inline函数替换#defines。
三、条款03-尽可能使用const
1.char test[] = "hello";
char* p = test;  // non-const pointer, non-const data
const char* p = test; // non-const pointer, const data
char const* p = test; // non const pointer, const data
char* const p = test; // const pointer, non-const data
const char* const p = test; // const pointer, const data
2.令函数返回一个常量值,往往可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性
3.const成员函数,第一可以使class接口比较容易理解,这是因为得知哪个函数可以改动对象内容而哪个函数不行,很是重要的。第二,它们使“操作const对象"成为可能。
4.两个成员函数如果只是常量性(constness)不同,可以被重载
5.成员函数如果是const,有两个流行概念:bitwise constness(又称physical constness)和logical constness
6.const成员函数不可以更改对象内任何non-static成员变量
7.关键字mutable可释放掉non-static成员变量的bitwise constness约束。声明为mutable的成员变量可能总会被改变,即使在const成员函数内
8.const是个奇妙且非比寻常的东西。在指针和迭代器身上;在指针、迭代器及reference指涉的对象身上;在函数参数和返回类型身上;在local变量身上;在成员函数身上,林林总总不一而足
9.将某些东西声明为const可帮助编译器侦测出错误用法
10.编译器强制实施bitwise constness,但你编程程序时应该使用"概念上的常量性"(conceptual constness)
11.当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复[注:不要做反向调用]
四、条款04-确定对象被使用前已被初始化
1.对于无任何成员的内置类型,你必须手工完成初始化。至于内置类型以外的,初始化的责任落在构造函数身上。规则很简单:确何每一个构造函数都将对象的每一个成员初始化
2.C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前
3.所以尽量使用初始化列表(member initialization list),而不使用赋值初始化。初始化列表单只调用一次copy构造,而赋值初始化则要调用一次default构造和一次copy assignment操作符。显然使用初始化列表是比较高效的
4.C++有着十分固定的“成员初始化次序”。次序总是相同:base classes更早于其derived classes被初始化,而class的成员变量总是以其声明次序被初始化(即使它们在初始化列表中以不同的次序出现,也不会有任何影响),所以初始化列表最好是其成员变量声明顺序,以免出现晦涩错误(是指两个成员变量的初始化带有次序性。如初始化array时需要指定大小,因此代表大小的成员变量必须先有初值)
5.C++对“定义于不同的编译单元(是指产出单一目标文件的那些源码。基本上它是单一源码文件加上其所含入的头文件[#include files])内的non-local static对象”的初始化相对次序并无明确定义。可将non-local static对象般到自己的专属函数内,变为local static对象。这些函数返回一个reference指定它所含的对象。然后用户用这些函数,而不直接指涉这些对象。这也是Design Patterns里Singleton模式的一个常见手法。这个手法的基础在于:C++保证,函数内的local static对象会在“该函数被调用期间”“首次遇上该对象之定义式”时被初始化。但是从另一个角度看,这些函数“内含static对象“的事实使它们在多线程系统中带有不确定性。任何一种non-const static对象,不论它是local或non-local,在多线程环境下“等待某事发生”都会有麻烦。处理这个麻烦的一种做法是:在程序的单线程启动阶段手工调用所有reference-returning函数,这个消除与初始化有关的“竞速形势”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值