Effective C++ 笔记(一)

E0

以值传递(pass-by-value)意味着调用拷贝构造函数

E2 尽量以constenuminline替换#define

整数类型(intshortcharbool)的静态常量数据成员(static-const-member)可以在类声明中赋初值。

对于常量,以constenum替换define,对于函数,以inline替换define

E3 尽可能使用const

给不会改变成员变量的成员函数加上const,理由一:很容易被理解和维护;理由二:使操纵const对象成为可能。

对于因为常量性不同而实现重载的函数,常对象优先调用常函数,非常量对象优先调用非常量函数。

如果函数的返回值是内置类型的副本,该返回值将不能够成为一个左值,而类的副本就可以(所以要加上const避免类的副本成为左值)。

E4 确定对象被使用前已先被初始化

C++不保证对内置类型进行初始化,所以应该手工初始化。

内置类型的初始化与赋值成本是一样的。

externC/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在其它模块中找到。

面向过程的static

static变量不能被extern

静态函数不能被其它文件所用,其它文件中可以定义相同名字的函数,不会发生冲突。

面向对象的static

静态成员变量在全局数据区。

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

这四个函数只会在程序调用时才生成。

如果类成员有引用类型或者常量类型,则编译器不会自动生成这些函数,编译出错。(只能自己写了)

E6 若不想使用编译器自动生成的函数,就该明确拒绝

方法是显示声明相应的成员函数为private并且不予实现。没有实现的函数可以通过编译,但是外部调用时就会产生链接错误。

E7 为多态基类声明virtual析构函数

为具有多态性质的基类或者带有virtual函数的类声明一个虚析构函数。否则不要声明虚析构函数。

有时候为了制作一个Abstract的类,需要一个纯虚函数,如果没有其他纯虚函数,可以将析构函数声明为纯虚,此时必须有一个该函数的定义(尽管是纯虚的),因为继承它的派生类的析构函数将会调用它(否则会链接错误)。

E8 别让异常逃离析构函数

E9 绝不在构造和析构过程中调用virtual函数

因为这类调用不会下降至派生类。

这么做是有理由的,在父类构造期间,子类包括其成员都还未初始化,那么调用子类函数的时候,涉及到的子类成员将是未定义的。

于此类似的一点是,构造函数调用自己的static函数将会比调用自己的成员函数更为安全,理由是,static不可能意外指向“初期未成熟之类对象内尚未初始化的成员变量”。

E10 operator=返回一个reference to *this

就是为了更好地模仿真正的赋值运算符,即提供赋值连锁功能。

E11 operator=中处理自我赋值

未经检查的自我赋值带来的麻烦

    对象被赋予新值的时候,有时候会先删除原有的旧值,如果这个时候是自我赋值的话,新值也会不存在(因为新值跟旧值是同一个东西)。

    自我赋值当然会降低效率。

确保自我赋值时operator=有良好行为

    比较来源对象与目标对象的地址以确保不会发生自我赋值。

    精心周到的语句顺序(即先赋予新值,再删去旧值)能够确保异常安全。

    通过copy-and-swap技术。如果operator=以值接受实参,则可以直接swap

E12复制对象时勿忘其每一个成分

拷贝构造函数应确保复制对象内的所有成员变量以及调用所有基类内适当的拷贝构造函数。

不可以以一个copy函数实现另外一个copy函数。

E13以对象管理资源

RAIIResource Acquisition Is Initialization

本条款的核心思想是,将获得的资源放入管理对象,管理对象运用析构函数确保资源被释放。

E14 在资源管理类中小心copy行为

必须定义RAII对象的复制行为,可以抑制,施行引用计数法,或者转移资源所有权等。

E15 在资源管理类中提供对原始资源的访问

必须提供访问途径,显示转换比较安全,隐式转换就比较方便。

E16 成对使用newdelete时采取相同的形式

尽量不要对数组形式做typedef动作,这样会隐藏数组的new形式从而使销毁资源时错用delete而没有用delete[]

E17 以独立语句将newed对象置入指针

主要是防止出现异常的时候没机会正确delete对象。

E18 让接口容易被正确使用,不易被误用

E19 设计class犹如设计type

新的type应该如何被创建和销毁

初始化和赋值应该有怎样的区别

通过拷贝构造函数实现pass-by-value的实现

type的合法值

配合新type所属的继承体系

提供什么样的类型转换

提供操作符和函数

驳回某些标准函数(显示声明并设为私有)

谁该访问type的成员

。。。

E20 宁以pass-by-reference-to-const替换pass-by-value

前者比较高效,而且避免了对象切割,对于STL以及内置类型,就应该用后者。

E21 必须返回对象时,别妄想返回其reference

返回local stack对象的指针或者引用都是错误的。

返回已经创建在堆上的对象的指针或者引用是错误的。

返回local static对象的指针或者引用也是错误的(一种例外是,local static替换non-local static以确定跨编译单元之初始化次序)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值