下面规则针对的问题是如何在C++里表述各种事物,这里不讨论能表述什么。

不隐式地违反静态类型系统:每个对象在建立时就具有特定的类型,例如double、char*或dial_buffer等。如果以与对象的类型不一致的方式去使用它,那就是违背了类型系统。绝不允许这种情况发生的语言称为是强类型的。如果一种语言能在编译时确认所有违反类型系统的情况,那么它就是强静态类型的。

C++ 从C语言继承了许多特征,例如联合、强制转换和数组,这就使它不可能在编译时检查出所有违反类型系统的情况。这就是说,你需要显式使用联合、强制转换、数组、明确不加检查的函数参数,或者显式使用不安全的C连接去违反这里的类型系统。所有不安全特征的使用都可以处理为(在编译时)产生警告。更重要的是,目前的C++ 已经拥有了一些很好的语言特征,采用它们更方便而又同样有效,因此可以避免使用不安全的特征。这方面的例子包括派生类(2.9节)、标准数组模板(8.5节)、类型安全的连接(11.3节),以及动态检查的强制转换(14.2节)。由于与C语言兼容的需要以及常见的实践,维持目前这种状态的路还很长也很困难,但大部分程序员已经采纳了更安全的方式。

只要有可能,总在编译时进行检查。只要有可能,那些在处理单独编译单位时只能提供信息而无法检查的东西,都要在连接时检查。最后,这里还提供了运行时的类型信息(14.2节)和异常机制(第16章),以帮助程序员处理编译和连接都无法捕捉的错误条件。当然,在实践中,还是编译时检查的代价更低,也更值得信赖。

为用户定义类型提供与内部类型同样好的支持:因为我们把用户定义类型看作C++ 程序的核心,语言当然应该给它们尽可能多的支持。因此,例如“类对象只能在自由空间中分配”这样的限制就是无法接受的了。对于例如complex这样的算术类型,确实需要真正的局部变量,这也就导致了对于面向值的类型(实在类型)的支持不但可以与内部类型媲美,甚至还超过了它们。

局部化是好事情:人们写一段代码时总希望它是自足的,除了可能需要从其他地方得到一些服务。也希望能使用一种服务又不带来过多的麻烦和干扰。另外,人们也需要为其他人提供函数和类等,同时不担心其实现细节与其他人的代码出现相互干扰。

C语言距离这些思想都非常遥远,连接器可以看到所有全局函数和全局变量的名字,这些名字会与同样名字的其他使用互相冲突,除非显式将它们声明为static。任何名字都可以当作函数名使用而不必事先声明。作为早年把结构成员名也看成全局名的遗风,在一个结构里面声明的结构也是全局的。此外,预处理程序的宏处理根本不考虑作用域问题,因此,只要改变了头文件或编译器的某些选项,程序正文中的任意一段字符都可能变成另外的任何东西(18.1节)。如果你想去影响某些看起来是局部的代码,或希望通过某些小的“局部”修改影响整个世界的其他部分,上面这些东西的威力异常强大。公平地说,我认为这些东西对于理解和维护复杂的软件具有破坏性。因此决心提供更好的隔离手段,以对抗从“其他地方”来的破坏,对能从自己的代码中“引出”什么东西提供更好的控制。

对于代码局部化、使访问总是通过良好定义的接口进行而言,类是第一位的最重要的机制。嵌套类(3.12节和13.5节)和名字空间进一步扩展了局部作用域和访问权的显式授予的概念。由于这些情况,在一个系统里的全局信息的总量大大减少了。

访问控制使访问局部化,而且没有因为完全的隔离而造成运行时间或存储空间的额外开销(2.10节)。抽象类使人可以以最小的代价得到最大程度的隔离(13.2节)。

在类和名字空间里,人们可以将声明和实现分开,这也非常重要,因为这样做使人更容易看到一个类到底做了些什么,而不必不断地跳过描述有关工作如何完成的函数体。允许在类声明中写inline函数,这样,当上述分离不合适时,可以得到另一种局部性。

最后,如果代码中重要的块能放进一个屏幕,对于理解和操作也将大有裨益。C语言传统的紧凑性在这方面很起作用,C++ 允许在需要使用的地方引进新变量(3.11.5节),也是在这个方向上前进了一步。

避免顺序依赖性:顺序依赖性很容易使人感到困惑,在重新组织代码时也容易引进错误。人们都会注意到,语句将按定义的顺序执行,但却往往会忽视全局声明之间和类成员声明之间的相互依赖性。重载规则(11.2节)和基类的使用规则(12.2节)都经过了特殊处理,避免其中出现对顺序的依赖性。理想情况是,如果交换两个声明的顺序会导致另一种不同的意思,那么这就应该是一个错误。对于类成员的规则就是这样(6.3.1节)。但是,对全局声明不可能做到这一点。C预处理程序可以通过宏处理引进根本无法预期的病态依赖性,从而可能造成很大的破坏(18.1节)。

我在某个时候曾经表达过有关避免微妙的解析方式的愿望,说:“帮助你下决心不应该是编译器的事情”。换句话说,产生编译错误将比产生某种含糊的解析更容易接受。多重继承的歧义性规则是这方面的好例子(12.2节)。关于重载函数的歧义性规则是另一个例子,它也说明了在兼容性和灵活性的约束下,要做好这件事有多么困难(11.2.2节)。

如果有疑问,就选择该特征的最容易说清楚的形式:这是在不同可能性之中做选择的第二规则,使用起来很有技巧性,因为它有可能变成一种关于逻辑美的争论,而且可能与熟悉不熟悉有关。写出描述它的辅导材料和参考手册,看看人们是否容易理解,是这个规则的一种实践方式。这里的一个意图就是简化教学人员和维护人员的工作。还应该记住,程序员们不笨,不应该通过付出重要的功能方面的代价去换取简单性。

语法是重要的(常以某些我们不希望的方式起作用):保证类型系统的一致性,一般而言,保证语言的语义清晰、定义良好,是最基本的东西。语法是第二位的,而且,看起来人们能学会去喜爱任何语法形式。

当然,语法就是人们看到的东西,也是语言最基本的用户接口。人们喜爱某些形式的语法,并以某种奇特的狂热去表达他们的意见。我认为,想改变这些东西,或者不顾人们对某些特定语法的对抗情绪去引进新的语义或设计思想,都是没希望成功的。因此,C++ 的语法,在设法使其更合理和规范的同时,也尽可能避免去触犯程序员们的成见。我的目标是逐渐使一些讨厌的东西淡出,例如隐含的int(2.8.1节)和老风格的强制(14.3.1节)等,同时又尽可能地减少使用更复杂形式的声明符语法(2.8.1节)。

我的经验是,人们往往过分热衷于通过关键词来引进新概念,以至于如果一个概念没有自己的关键词,教起来就非常困难。这种作用是很重要的、根深蒂固的,远远超过人们口头上表述的对新关键词的反感。如果给他们一点时间去考虑并做出选择,人们无疑地会选择新的关键词,而不是某种聪明的迂回方案。

我试着把重要操作做成很容易看见的东西。例如,老风格强制的一个重要问题是它们几乎不可见。此外,我也喜欢把语义上丑陋的操作在语法上也弄成丑陋的,与语义相匹配,例如病态的类型强制(14.3.3节)。一般说,也应该避免过分啰嗦。

清除使用预处理程序的必要性:如果没有C预处理程序,C语言本身和后来的C++ 可能早就是死胎了。没有Cpp,它们根本就不能有足够的表达能力和灵活性,不能处理重要项目中所需要完成的各种任务。但在另一方面,Cpp丑陋低级的语义也使构造和使用更高级、更优雅的C程序设计环境变得过分困难、代价过分昂贵。

因此,必须针对Cpp的每个基本特征,找到符合C++ 语法和语义的替代品。如果这个工作能够完成,我们就可能得到一个更便宜的大大改进的C++ 程序设计环境。沿着这个方向,我们也将清除许多很难对付的错误的根源。模板(第15章)、inline函数(2.4.1节)、const(3.8节)和名字空间(第17章)都是在这个方向上留下的脚印。

C++语言的技术性规则相关推荐

  1. python语言变量命名规则有什-以下选项中,符合Python语言变量命名规则的是_学小易找答案...

    [填空题]与文件系统相比,数据库系统的数据冗余度___________,数据共享性___________. [填空题]在数据库体系结构中,两级数据映象分别是指___________之间的数据映象与__ ...

  2. 一个基本c语言注释用什么字符,C语言的词法规则京鸿智武 今天提纲:本文主要介绍了C语言中...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言的词法规则 京鸿智武 今天 提纲:本文主要介绍了C语言中的词法规则,包括字符.注释.接续符.标识符 一.字符 1.字符集都包括什么? 标准规定字符集 ...

  3. python语言在命名上是什么敏感的_一文轻松掌握python语言命名规范规则

    和C/C++.Java等语言一样,python在命名上也有一套约定俗成的规则,符合规范的命名可以让程序的可读性大大增加,从而使得代码的逻辑性增强,易于自己和其他协作者在以后的拓展中理解代码的意义,从而 ...

  4. python语言变量名规则_python语言变量命名规则

    Python语言变量命名规则 变量名只能包含字母.数字和下划线.(推荐学习:Python视频教程) 变量名可以字母或下划线开头,但不能以数字开头.例如,可将变量命名为message_1,但不能将其命名 ...

  5. php函数名命名规范,PHP语言的命名规则

    PHP语言的命名规则 想要了解和掌握PHP语言,我觉得掌握PHP语言的命名规则很重要,下面小编为大家介绍关于PHP语言的命名规则,欢迎大家阅读! PHP语言的命名规则 1. 类命名 使用大写字母作为词 ...

  6. python语言命名规则-一文轻松掌握python语言命名规范规则

    和C/C++.Java等语言一样,python在命名上也有一套约定俗成的规则,符合规范的命名可以让程序的可读性大大增加,从而使得代码的逻辑性增强,易于自己和其他协作者在以后的拓展中理解代码的意义,从而 ...

  7. c语言变量名用一个字母,C语言变量命名规则

    <C语言变量命名规则>由会员分享,可在线阅读,更多相关<C语言变量命名规则(6页珍藏版)>请在人人文库网上搜索. 1.1.严格采用阶梯层次组织程序代码:各层次缩进的分格采用VC ...

  8. 根据c语言的语法规则,下列( )是用户定义的合法标识符,C语言期末复习题附答案...

    建议下载打印复习 1.凡是函数中未指定存储类型的局部变量,其隐含的存储类型为( A ). A.auto C.extern 2.若有定义:int *ptr[6];则标识符ptr( B ). A.是一个指 ...

  9. c语言表达式语法问题,c语言表达式语法规则是什么_后端开发

    c语言统计单词个数的方法_后端开发 在一篇文章中单词都是用空格隔开的,所以单词个数=空格数+1,c语言统计单词个数实际上转换成了统计文章中的空格数,可以用while和if来进行统计. c语言表达式语法 ...

最新文章

  1. 年轻群体当道,哈弗F7如何赢得芳心?
  2. oracle批次处理数据_Oracle大批量删除数据方法(转)
  3. 云开发数据库又增新技能!
  4. es6 --- 使用生成器交替执行
  5. java .vm h2_java-H2服务器在调试时挂起
  6. SerializeUtil 序列化 java
  7. 荣耀老熊晒荣耀V30新机样张:还有更深远的未知空间
  8. Android JNI学习(五)——Java与Native之间如何实现相互调用
  9. (专题一)05 矩阵元素的引用方式
  10. make_heap(), pop_heap(), push_heap()用法
  11. i710700黑苹果_[Hackintosh]解决黑苹果无法使用Siri、iMessage等服务
  12. 【编译原理】词法分析(C/C++源代码+实验报告)
  13. 论文的英文文献在哪找(除了知网)?
  14. OrCAD多页原理图器件按页编号的设置
  15. 03.计算机网络--- 网络层、IP协议、手工配置IP地址
  16. 《平凡的世界》读后感 — 孙少平篇
  17. 苹果电脑安装计算机一级,偷天换日!让普通笔记本安装苹果系统
  18. python之钉钉机器人自动发消息——傻瓜式教程
  19. 各手机品牌系列侧重方向
  20. javaSE_day17 学习笔记 ——泛型、Stream

热门文章

  1. Java-图片加水印-与图片缩放
  2. Spring Boot(1) 入门、自动配置
  3. 查找php中的内容,如何通过PHP从内容中查找URL?
  4. java 复写hashcode_java 重写equals()和hashCode()
  5. vue中检测敏感词,锚点
  6. Commons Configuration2 - Quick start guide
  7. Asp.net高效导出excel篇之Aspose导出excel
  8. 当别人问你自定义哪些hooks
  9. 【Vue2.0】— 全局事件总线GlobalEventBus(十九)
  10. 零基础带你学习MySQL—数学函数(十四)