条款1:视C++为一个语言联邦

条款1:视C++为一个语言联邦

​   最开始C++只是在C上添加了一些面向对象的特性。从C++最初的名称C with Classes也反映了这个血缘关系。

​   随着C++的发展和成熟,其体系越来越庞大,开始接受不同于面向对象的各种观念、特性以及编程战略。exception对函数结构化带来不同的做法,templates将我们带到新的设计思考方式,STL定义了一个前所未见的伸展性做法。今天的C++已经是一个多重范型编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式以及元编程形式的语言。这些能力和弹性使C++成为一个无可匹敌的工具。

​   那我们如何理解C++这门语言呢?最简单的方法就是将C++视为一个由相关语言组成的联邦(集合),而非单一语言。在其某个次语言中,各种守则与通例都倾向简单、直观易懂并且容易记住。然而你从一个次语言移往另外一个次语言,守则可能改变,为了理解C++,你必须认识其主要的次语言。其主要的次语言大概包括四个:

  • C。说到底C++仍是以C为基础。函数块(blocks)、语句(statements)、预处理器(preprocessor)、内置数据类型(build-in data types)、数组(array)、指针(pointer)等都来自C。许多时候,C++对问题的解法其实不过是较高级的C解法,(例如条款2中谈到的预处理器的另外一个选择,条款13谈到以对象管理资源),当你以C++中的C成分工作时,高效编程守则映射出C语言的局限:没有模板(template)、没有异常(exception),没有重载(overload)
  • Object-Oriented C。这部分是C++最原始的功能:面向对象。classes中包括构造函数/析构函数;封装(encapsulation)、继承(inheritance)、多态(polymorphism)、virtual函数。这部分直接反映了C++的面向对象特性
  • Template C++。这是C++的泛型编程部分,也是大多数程序员编程经验最少的部分。template相关考虑和设计的已经弥漫整个C++,良好的编程守则中“唯template适用”的特殊条款并不罕见(如条款46中,谈到调用template functions时如何协助类型转换)。实际上由于template威力强大,它带来崭新的编程范型,也就是所谓的template metaprograming(TMP,模板元编程),TMP相关规则很少与C++主流编程互相影响。
  • STL。STL是template程序库,看名称也知道,但是它是非常特殊的一个。他对容器(containers)、迭代器(iterators)、算法(algorithms)以及函数对象(function objects)的规约有极佳的紧密配合与协调,然而templates以及程序库也可以其他想法建置出来。STL有自己特殊的办事方式,当你伙同STL工作时,你必须遵顺它的规约。

​   当从一种次语言转向另一种次语言的时候,可能会导致高效编程规则有所变化。例如对于内置类型而言pass-by-value通常比pass-by-reference高效,但是当你从C移往Object-Oriented C的时候,由于用户自定义的构造函数和析构函数的存在,pass-by-reference-to-const往往更高效。运用Template C++时尤为如此,因为这个时候你甚至不知道所处理对象的类型。然而一旦跨入STL你就会了解,迭代器和函数对象都是在C指针的基础上塑造出来的,所以对STL的迭代器和函数对象而言,旧式的C pass-by-value守则则再次适用。

​   所以说C++并不是一个带有一组守则的一体语言;它是从四个次语言组成的联邦,每个次语言都有自己的守则,同样的用法在不同次语言中的守则可能不同,按照这四个次语言理解C++比较容易了解的多。

总结:C++高效编程守则视情况而变化,取决于你使用C++的哪一部分。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值