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:不要混合使用它们
相关文章推荐
- c语言--二维数组的首地址问题
- C++ 拷贝构造函数 赋值构造函数
- OC语言中的block数据类型
- C++微专业课程辅导(内存模型和动态内存)
- 【C++】二叉树的创建方法及其遍历的递归与非递归方法总结
- 【第3周 项目2 - 建设“顺序表”算法库】
- C++Primer第五版 6.5.1节练习
- C++Primer第五版 6.4节练习
- C++模板
- C++Primer第五版 6.3.3节练习
- C++外观设计模式模式(三)
- c++中的数据类型
- 线性表的C++实现
- C++Primer第五版 6.3.2节练习
- c++容器类
- C++中pair用法
- c++生成伪随机数的方法
- C++Primer第五版 6.2.6节练习
- C++Primer第五版 6.2.5节练习
- 绝对不要重新定义继承而来的non-virtual函数(Effective C++_36)