- 1、本文档被系统程序自动判定探测到侵权嫌疑,本站暂时做下架处理。
- 2、如果您确认为侵权,可联系本站左侧在线QQ客服请求删除。我们会保证在24小时内做出处理,应急电话:400-050-0827。
- 3、此文档由网友上传,因疑似侵权的原因,本站不提供该文档下载,只提供部分内容试读。如果您是出版社/作者,看到后可认领文档,您也可以联系本站进行批量认领。
查看更多
从C转向C
从C转向C++
对每个人来说,习惯C++需要一些时间,对于已经熟悉C 的程序员来说,
这个过程尤其令人苦恼。因为C 是C++的子集,所有的C 的技术都可以继续使
用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很
古怪,他们会问:为什么不用指针的引用来代替呢?
C 是一种简单的语言。它真正提供的只有有宏、指针、结构、数组和函数。
不管什么问题,C 都靠宏、指针、结构、数组和函数来解决。而C++不是这样。
宏、指针、结构、数组和函数当然还存在,此外还有私有和保护型成员、函数
重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、
模板、异常、名字空间,等等。用 C++比用C 具有更宽广的空间,因为设计时
有更多的选择可以考虑。
在面对这么多的选择时,许多 C 程序员墨守成规,坚持他们的老习惯。一
般来说,这也不是什么很大的罪过。但某些 C 的习惯有悖于C++的精神本质,
他们都在下面的条款进行了阐述。
条款1:尽量用const和inline而不用#define
这个条款最好称为:“尽量用编译器而不用预处理”,因为#define 经常被认
为好象不是语言本身的一部分。这是问题之一。再看下面的语句:
#define ASPECT_RATIO 1.653
编译器会永远也看不到 ASPECT_RATIO 这个符号名,因为在源码进入编译器
之前,它会被预处理程序去掉,于是ASPECT_RATIO 不会加入到符号列表中。
如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指
的是1.653,而不是ASPECT_RATIO 。如果ASPECT_RATIO 不是在你自己写
的头文件中定义的,你就会奇怪1.653 是从哪里来的,甚至会花时间跟踪下去。
这个问题也会出现在符号调试器中,因为同样地,你所写的符号名不会出现在
符号列表中。
解决这个问题的方案很简单:不用预处理宏,定义一个常量:
const double ASPECT_RATIO = 1.653;
这种方法很有效。但有两个特殊情况要注意。
首先,定义指针常量时会有点不同。因为常量定义一般是放在头文件中 (许
多源文件会包含它),除了指针所指的类型要定义成const 外,重要的是指针也
经常要定义成 const。例如,要在头文件中定义一个基于 char*的字符串常量,
你要写两次const :
const char * const authorName = Scott Meyers;
关于const 的含义和用法,特别是和指针相关联的问题,参见条款21 。
另外,定义某个类(class)的常量一般也很方便,只有一点点不同。要把常
量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,
还要把它定义为静态成员:
class GamePlayer {
private:
static const int NUM_TURNS = 5; // constant declaration
int scores[NUM_TURNS]; // use of constant
...
};
还有一点,正如你看到的,上面的语句是 NUM_TURNS 的声明,而不是定义,
所以你还必须在类的实现代码文件中定义类的静态成员:
const int GamePlayer::NUM_TURNS; // mandatory definition;
// goes in class impl. file
你不必过于担心这种小事。如果你忘了定义,链接器会提醒你。
旧一点的编译器会不接受这种语法,因为它认为类的静态成员在声明时定
义初始值是非法的;而且,类内只允许初始化整数类型(如:int, bool, char 等),
还只能是常量。
在上面的语法不能使用的情况下,可以在定义时赋初值:
class EngineeringConstants { // this goes in the class
private: // header file
您可能关注的文档
最近下载
知传链电子书
- 计算思维与算法设计基础.pdf
- 网络编辑:内容规划 文案创作 运营推广.pdf
- 在家就能做的80个STEAM科学小实验.pdf
- Django实战:Python Web典型模块与项目开发.pdf
- 网店商品拍摄与后期制作(微课版)--商品拍摄+图片处理+视频制作.pdf
- Photoshop CC 2018基础与实战教程(全彩版).pdf
- 中文版Revit 2016完全自学教程(培训教材版).pdf
- Adobe Photoshop 2020基础培训教材.pdf
- Adobe Camera Raw数码摄影后期处理完全解析(Photoshop 通用版).pdf
- 汽车发动机机械系统实训工单(AR版).pdf
文档评论(0)