设为首页 加入收藏

TOP

术语(Terminology)(1)
2013-10-07 13:18:52 来源: 作者: 【 】 浏览:60
Tags:术语 Terminology

0 导读

Introduction

学习程序语言根本大法是一回事;学习如何以某种语言设计并实现高效程序则是另一回事。这种说法对C++(www.cppentry.com) 尤其适用,因为C++(www.cppentry.com) 以拥有罕见的威力和丰富的表达能力为傲。只要适当使用,C++(www.cppentry.com) 可以成为工作上的欢愉伙伴。巨大而变化多端的设计可以被直接表现出来,并且被有效实现出来。一组明智选择并精心设计的classes, functions和templates可使程序编写容易、直观、高效、并且远离错误。如果你知道怎么做,写出有效的C++(www.cppentry.com) 程序并不太困难。然而如果没有良好培训,C++(www.cppentry.com) 可能会导致你的代码难以理解、不易维护、不易扩充、效率低下又错误连连。

本书的目的是告诉你如何有效运用C++(www.cppentry.com)。我假设你已经知道C++(www.cppentry.com) 是个语言并且已经对它有某些使用经验。这里提供的是这个语言的使用导引,使你的软件易理解、易维护、可移植、可扩充、高效、并且有着你所预期的行为。

我所提出的忠告大致分为两类:一般性的设计策略,以及带有具体细节的特定语言特性。设计上的讨论集中于"如何在两个不同做法中择一完成某项任务"。你该选择inheritance(继承)还是templates(模板)?该选择public继承还是private继承?该选择private继承还是composition(复合)?该选择member函数还是non-member函数?该选择pass-by-value还是pass-by-reference?在这些选择点上做出正确决定很重要,因为一个不良的决定有可能不至于很快带来影响,却在发展后期才显现恶果,那时候再来矫正往往既困难又耗时间,而且代价昂贵。

即使你完全知道该做什么,完全进入正轨还是可能有点棘手。什么是assignment 操作符的适当返回类型(return type)?何时该令析构函数为virtual?当operator new

无法找到足够内存时该如何行事?榨出这些细节很是重要,因为如果疏忽而不那么做,几乎总是导致未可预期的、也许神秘难解的程序行为。本书将帮助你趋吉避凶。

这并不是一本范围广泛的C++(www.cppentry.com) 参考书。这是一份55个特定建议(我称之为条款)的集合,谈论如何强化你的程序和设计。每个条款有相当程度的独立性,但大多数也参考其他条款。因此阅读本书的一个方式是,从你感兴趣的条款开始,然后看它逐步把你带往何方。

本书也不是一本C++(www.cppentry.com) 入门书籍。例如在第2章中我热切告诉你实现构造函数(constructors)、析构函数(destructors)和赋值操作符(assignment operators)的一切种种,但我假设你已经知道或有能力在其他地方学得这些函数的功能以及它们如何声明。市面上有许多C++(www.cppentry.com) 书籍内含这类信息。

本书目的是要强调那些常常被漠视的C++(www.cppentry.com) 编程(www.cppentry.com)方向与观点。其他书籍描述C++(www.cppentry.com) 语言的各个成分,本书告诉你如何结合那些成分以便最终获得有效程序。其他书籍告诉你如何让程序通过编译,本书告诉你如何回避编译器难以显露的问题。

在此同时,本书将范围限制在标准C++(www.cppentry.com) 上头。书内只会出现官方规范上所列的特性。本书十分重视移植性,所以如果你想找一些与平台相依的秘诀和窍门,这里没有。

另一个你不会在本书发现的是C++(www.cppentry.com) 福音书--走向完美C++(www.cppentry.com) 软件的唯一真理之路。本书每个条款都提供引导,告诉我们如何发展出更好的设计,如何避免常见的问题,或是如何达到更高的效率,但没有任何一个条款放之四海皆准、一体适用。软件设计和实现是复杂的差使,被硬件、操作系统、应用程序的约束条件涂上五颜六色,所以我能做的最好的就是提供指南,让你得以创造出更棒的程序。

如果任何时间你都遵循每一条准则,不太可能掉入C++(www.cppentry.com) 最常见的陷阱中。但是所谓准则天生就带有例外。这就是为什么每个条款都有解释与说明。这些解释与说明是本书最重要的一部分。惟有了解条款背后的基本原理,你才能够决定是否将它套用于你所开发的软件,并奉行其所昭示的独特约束。

本书的最佳用途就是彻底了解C++(www.cppentry.com) 如何行为、为什么那样行为,以及如何运用其行为形成优势。盲目应用书中条款是非常不适合的。但如果没有好理由,你或许也不该违反任何一个条款。

术语(Terminology)(1)

下面是每一位程序员都应该了解的一份小小的C++(www.cppentry.com) 词汇。其中的术语十分重要,我们必须确认彼此都同意它们的意义。

所谓声明式(declaration)是告诉编译器某个东西的名称和类型(type),但略去细节。下面都是声明式:

  1. extern int x;               //对象(object)声明式  
  2. std::size_t numDigits(int number);//函数(function)声明式  
  3. class Widget;               //类(class)声明式  
  4.  
  5. template<typename T>            //模板(template)声明式  
  6. class GraphNode;                //"typename" 的使用见条款42 

注意,我谈到整数x 时称其为一个对象(object),即使它是个内置类型。某些人把"对象"一词保留给用户自定义类型(user-defined type)的变量,但我并不如此。也请注意,函数numDigit的返回类型是std::size_t,这表示类型size_t位于命名空间std内。这个命名空间是几乎所有C++(www.cppentry.com) 标准程序库元素的栖身处。然而C(正确说法是C89)标准程序库也适用于C++(www.cppentry.com),而继承自C的符号(例如size_t)有可能存在于global作用域或std 内,甚或两者兼具,取决于哪个头文件被含入(#included)。本书之中我假设含入的都是C++(www.cppentry.com) 头文件,这也就是为什么我写std::size_t 而不只是写size_t。当我在文本中指称标准程序库内的组件时,往往略去前导的std::,你得自己认清像size_t, vector, cout这类东西都在std内。但范例码中我总是会含入std,因为真实程序编译时不能没有它。

顺带一提,size_t 只是一个typedef,是C++(www.cppentry.com) 计算个数(例如char*-based字符串内的字符个数或STL容器内的元素个数等等)时用的某种不带正负号(unsigned)类型。它也是vector, deque和string内的operator[]函数接受的参数类型。条款3阐述当我们定义自己的operator[]函数时应该遵循的协议。

每个函数的声明揭示其签名式(signature),也就是参数和返回类型。一个函数的签名等同于该函数的类型。numDigits函数的签名是std::size_t (int),也就是说"这函数获得一个int 并返回一个std::size_t"。C++(www.cppentry.com) 对签名式的官方定义并不包括函数的返回类型,不过本书把返回类型视为签名的一部分,这样比较有帮助。

定义式(definition)的任务是提供编译器一些声明式所遗漏的细节。对对象而言,定义式是编译器为此对象拨发内存的地点。对function或function template而言,定义式提供了代码本体。对class或class template而言,定义式列出它们的成员:

  1. int x;                      //对象的定义式  
  2. std::size_t numDigits(int number)//函数的定义式  
  3. {                           //此函数返回其参数的数字个数,  
  4. std::size_t digitsSoFar = 1;    //例如十位数返回2,百位数返回3.  
  5.  
  6. while ((number /= 10) != 0) ++digitsSoFar;  
  7. return digitsSoFar;  
  8. }  
  9.  
  10. class Widget {              //class的定义式  
  11. public:  
  12. Widget();  
  13. ~Widget();  
  14. ...  
  15. };  
  16.  
  17. template<typename T>            //template的定义式  
  18. class GraphNode {  
  19. public:  
  20. GraphNode();  
  21. ~GraphNode();  
  22. ...  
  23. }; 
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.4.3 Visual C++ 6.0编程操作介.. 下一篇条款02:尽量以const, enum, inli..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: