《Effective C++》总结 上

1、让自己习惯C++

条款01:视C++为一个语言联邦
C++并不是一个带有一组守则的一体语言,它是从四个次语言组成的联邦政府,这四个次语言分别是:
C:C++是以C为基础的,区块、语句、预处理、内置数据类型、数组、指针等都来自C。
Object-Oriented C++:是C with Class所诉求的,是面向对象设计之古典守则在C++上的最直接实施。
Template C++:这是C++泛型编程的部分。
STL:是个template程序库,对容器、迭代器、算法以及函数对象的规约有极佳的紧密配合与协调。
C++高效编程守则视状况而变化,取决于你使用C++的哪一部分。

条款02:尽量以const,enum,inline替换#define
也就是宁可 以编译器替换预处理器。#define 定义一个标识符来表示一个常量。其特点是:定义的标识符不占内存,只是一个临时的符号,预编译后这个符号就不存在了。(预编译又叫预处理。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。)如下这个宏:

//以a和b的较大值调用f
#define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))

无论何时,写出这个宏,都必须记住为宏中的所有实参加上小括号,否则在表达式中调用这个宏时可能会遭遇麻烦,因为它只是简单的替换而已。但纵使你为所有实参加上小括号,看看下面不可思议的事情:

int a = 5, b = 0;
CALL_WITH_MAX(++a, b);         //a被累加2次
CALL_WITH_MAX(++a, b+10);     //a被累加1次

总之,涉及到比较复杂的宏替换,会遇到很多不可思议的麻烦,尽量少用。
对于单纯常量,最好以const对象或enum替换#define。
对于形似函数的宏,最好改用inline函数替换#define。

条款03:尽可能使用const
将某些东西声明为const,可帮助编译器侦测出错误的用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。
编译器强制实施bitwise constness,但你编写程序时,应该使用“概念上的常量性”(conceptual constness)。
当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

条款04:确定对象被使用前已先被初始化
读取未初始化的值会导致不明确的行为。
为内置型对象进行手工初始化,因为C++不保证初始化它们。
构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列列出的成员变量,其排列次序应该和它们在class中的声明次序相同。
为免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。

2、构造/析构/赋值运算

几乎你写的每一个class,都会有一个或多个构造函数、一个析构函数、一个拷贝赋值操作符。
条款05:了解C++默默编写并调用哪些函数
编译器可以暗自为class创建默认构造函数、拷贝构造函数、拷贝赋值操作符、以及析构函数。记住,这些函数不是类一创建出来就有的,惟有当这些函数被需要(调用),它们才会被编译器创建出来。
当然,如果你在创建类时,自己声明了那些函数,编译器就不会再创建了。

条款06:若不想使用编译器自动生成的函数,就该明确拒绝
为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private并且不予实现。可以专门为了阻止copying动作而设计一个base class,如下:

class Uncopyable{
   
protected:                              //允许derived对象构造和析构
	Uncopyable() {
   }
	~Uncopyable() {
   }
private:
	Uncopyable(const Uncopyable&);     //阻止copying
	Uncopyable& operator=(const Uncopyable&);
}

条款07:为多态基类声明virtual析构函数
带有多态性质的base class应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。
class的设计目的如果不是作为base class使用,或不是为了具备多态性质,就不该声明virtual析构函数。

条款08:别让异常逃离析构函数
析构函数吐出异常就是危险,总会带来“过早结束程序”或“发生不明确行为”的风险。所以析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下他们(不传播)或结束程序。

class DBConn{
   
public:
...
	void close()                 //供客户使用的新函数
	{
   
		db.
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值