摘自《Effective C++》第一条条款。
今天的 C++ 已经是个多重范型编程语言 (multiparadigm programming language) ,一个同时支持过程形式(procedural) 、面向对象形式(object-oriented) 函数形式(functional) 、泛型形式 (generic) 、元编程形式(metaprogramming ) 的语言。这些能力和弹性使 C++ 成为一个无可匹敌的工具,但也可能引发某些迷 惑:所有”适当用法”似乎都有例外。我们该如何理解这样一个语言呢?
最简单的方法是将 C++ 视为一个由相关语言组成的联邦而非单一语言。在其某个次语言 (sublanguage) 中,各种守则与通例都倾向简单、直观易懂、并且容易记住。然而当你从一个次语言移往另一个次语言,守则可能改变。为了理解 C++ 你必须认识其主要的次语言。幸运的是总共只有四个:
C语言:
说到底 C++ 仍是以 为基础。区块 (blocks) 、语句( statements) 、预处理器(preprocessor) 、内置数据类型 (built-in data types) 、数组 (aπays) 指针 (pointers) 等统统来自 。许多时候 C++ 对问题的解法其实不过就是较高级的解法,但当你以 C++ 内的成分工作时,高效编程守则映照出语言的局限:没有模板(templates) ,没有异常(exceptions) ,没有重载(overloading) ..…·
备注:相对于原本的C而言,引用等功能应该是C++才有的。
C++的面向对象部分:
这部分也就是 with Classes 所诉求的: classes (包括构造函数和析构函数) ,封装( encapsulation) 、继承( inheritance) 、多态 (polymorphism)以及virtual 函数(动态绑定) ……等等。这一部分是面向对象设计之古典守则在 C++ 上的最直接实施。
备注:我觉得还有一个比较有用的是操作符重载。
C++的Template(模板):
Template C++。这是 C++ 的泛型编程 (generic programming) 部分,也是大多数程序员经验最少的部分。实际上由于 templates 威力强大,它 们带来崭新的编程范型 (programming paradigm) ,也就是所谓的 template meta programming (TMP,模板元编程)。
C++的模板和面向对象特性应该就是是让C++在超大规模的系统开发时代码能越写越少的主要原因吧。
备注:函数重载应该算是Template的特性吧。
C++的标准库(STL):
STL是个 template 程序库,看名称也知道,但它是非常特殊的一个。它对容器(containers) 、迭代器(iterators) 、算法(algorithms) 以及函数对象(function objects) 的规约有极佳的紧密配合与协调,然而templates及程序库也可以其他想法建置出来。 STL 有自己特殊的办事方式,当你伙同STL一起工作,你必须遵守它的规约。
总结:
记住这四个次语言,当你从某个次语言切换到另一个,导致高效编程守则要求你改变策略时,不要感到惊讶。
关于变量传递方式的问题:
- C类语言时,pass-by-value(传值) 通常比 pass-by-reference(传递引用)高效
- 使用面向对象中的类时,由于用户自定义( user-defined )构造函数和析构函数的存在, pass-by-reference-to-const(传递引用常量) 往往更好。
- 运用 Template C++ 时,因为迭代器和函数对象都是在指针之上塑造出来的,所以对STL 的迭代器和函数对象而言,旧式的 pass-by-value守则再次适用。
C++ 并不是一个带有一组守则的一体语言:它是从四个次语言组成的联邦政府,每个次语言都有自己的规约。记住这四个次语言你就会发现C++ 易了解得多。
转载请注明:旅途@KryptosX » 如何看待C++