您的位置:首页 > 编程语言 > C语言/C++

Effective C++ ——规则1-3

2015-09-15 11:23 344 查看

规则1:尽量用const ,enum ,inline ,而不要使用define

说明1:尽量用编译器而不是预处理器,因为预处理指令不是C++语言的一部分,不能直接对它们进行编译和链接。

注:C/C++提供的预处理功能主要有文件包含、宏替换、条件编译等

说明2:#define PI 3.1415926

编译器永远不会看不到PI这个符号名,因为预处理器会先于编译器处理PI,PI不会加入到符号列表中。如果涉及到这个常量的代码在编译时期报错,会令人很费解,因为报错信息指向的是3.1415926,而不是PI。

解决方案是使用const,const double Pi = 3.1415926;//宏命名采用全大写方式

说明3:const 两种特殊应用场合,一种是定义常量指针时,一种是作为类专属常量时

第一种:因为常量指针通常定义在头文件中,以备调用。所以一般需要使用const两次,如:const int const *pInt = nullptr;

第二种:类专属成员时,封装在类内,为了确保只有一个备份,会与static 关键字一起使用。

class Test

{

private:

static const int Num = 100;//常量声明,static const int 同时修饰变量时可以省略定义式,否则需要在cpp文件中定义,不在头文件定义是因为头文件可能会被多个地方保含

int arrar[Num ];

};

说明4:const 与define 区别之一

define 不具有封装特性,因其具有全局特性,除非遇到#undef。private #define 达不到效果。const 可以被封装而属于某个类专属。

说明5:有些老的编译器不支持static const int Num = 100;这样在编译期间就没办法知道数组的大小了,而编译器坚持需要在编译期间知道数组大小,此时可以使用enum代替const.

class Test

{

private:

enum {Num = 100};

int arrar[Num ];

};

注:enum 某些时候更像#define,如&操作符对const有效,而对宏和枚举非法。如果你不想你的常量被一个指针或引用指向,可以使用enum实现这个约束。

说明6:使用inline 函数代替形似函数的宏

规则2:尽量使用
<iostream>
,而不是
<stdio.h>

说明1:scanf以及printf 类型安全及可扩展性差,这也是C++较之C语言的优势

说明2:<< 和>>可以通过重载操作符增强功能,如支持链式编程

说明3:
<iostream>
是C++语言设计之初时为了区分C语言而故意去掉了后缀.h

说明4:
<iostream>
库中的类有构造析构函数,C库明显没有

规则3:尽量使用new delete,而不是malloc free

说明1:malloc 与free容易出问题在于太简单,他们不认识构造函数和析构函数,即初始化工作和清理工作。

说明2:free 在回收内存空间时,不能回收数组中的对象的内存空间,只会回收数组本身的内存空间,而delete可以

说明3:关键字new delete 或者malloc free 函数需要成对出现

说明4:不要混合使用它们
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: