Effective_C 2e

Effective_C 2e

ID:40059059

大小:516.47 KB

页数:304页

时间:2019-07-18

Effective_C  2e_第1页
Effective_C  2e_第2页
Effective_C  2e_第3页
Effective_C  2e_第4页
Effective_C  2e_第5页
资源描述:

《Effective_C 2e》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、从C转向C++对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说,这个过程尤其令人苦恼。因为C是C++的子集,所有的C的技术都可以继续使用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很古怪,他们会问:为什么不用指针的引用来代替呢?C是一种简单的语言。它真正提供的只有有宏、指针、结构、数组和函数。不管什么问题,C都靠宏、指针、结构、数组和函数来解决。而C++不是这样。宏、指针、结构、数组和函数当然还存在,此外还有私有和保护型成员、函数重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、模板、异常、名字空

2、间,等等。用C++比用C具有更宽广的空间,因为设计时有更多的选择可以考虑。在面对这么多的选择时,许多C程序员墨守成规,坚持他们的老习惯。一般来说,这也不是什么很大的罪过。但某些C的习惯有悖于C++的精神本质,他们都在下面的条款进行了阐述。条款1:尽量用const和inline而不用#define这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句:#defineASPECT_RATIO1.653编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,

3、它会被预处理程序去掉,于是ASPECT_RATIO不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己写的头文件中定义的,你就会奇怪1.653是从哪里来的,甚至会花时间跟踪下去。这个问题也会出现在符号调试器中,因为同样地,你所写的符号名不会出现在符号列表中。解决这个问题的方案很简单:不用预处理宏,定义一个常量:constdoubleASPECT_RATIO=1.653;这种方法很有效。但有两个特殊情况要注意。首先,定义指针常量时

4、会有点不同。因为常量定义一般是放在头文件中(许多源文件会包含它),除了指针所指的类型要定义成const外,重要的是指针也经常要定义成const。例如,要在头文件中定义一个基于char*的字符串常量,你要写两次const:constchar*constauthorName="ScottMeyers";关于const的含义和用法,特别是和指针相关联的问题,参见条款21。另外,定义某个类(class)的常量一般也很方便,只有一点点不同。要把常量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员:classGamePlay

5、er{private:staticconstintNUM_TURNS=5;//constantdeclarationintscores[NUM_TURNS];//useofconstant...};还有一点,正如你看到的,上面的语句是NUM_TURNS的声明,而不是定义,所以你还必须在类的实现代码文件中定义类的静态成员:constintGamePlayer::NUM_TURNS;//mandatorydefinition;//goesinclassimpl.file你不必过于担心这种小事。如果你忘了定义,链接器会提醒你。旧一点的编译器会不接受这种语法,

6、因为它认为类的静态成员在声明时定义初始值是非法的;而且,类内只允许初始化整数类型(如:int,bool,char等),还只能是常量。在上面的语法不能使用的情况下,可以在定义时赋初值:classEngineeringConstants{//thisgoesintheclassprivate://headerfilestaticconstdoubleFUDGE_FACTOR;...};//thisgoesintheclassimplementationfileconstdoubleEngineeringConstants::FUDGE_FACTOR=1.3

7、5;大多数情况下你只要做这么多。唯一例外的是当你的类在编译时需要用到这个类的常量的情况,例如上面GamePlayer::scores数组的声明(编译过程中编译器一定要知道数组的大小)。所以,为了弥补那些(不正确地)禁止类内进行整型类常量初始化的编译器的不足,可以采用称之为“借用enum”的方法来解决。这种技术很好地利用了当需要int类型时可以使用枚举类型的原则,所以GamePlayer也可以象这样来定义:classGamePlayer{private:enum{NUM_TURNS=5};//"theenumhack"—makes//NUM_TURNSa

8、symbolicname//for5intscores[NUM_TURNS];//fine..

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。