条款1 把C++看成是多种语言的联合体

C++作为一门多范式编程语言,包含了面向过程、面向对象、泛型及元编程等多种特性。本文介绍了C++的四个主要组成部分:C语言的基础、面向对象编程、模板编程及标准模板库(STL),并探讨了如何根据不同场景灵活运用这些编程策略。
	一开始,C++只是C加上了一些面向对象的特征。C++的最初名称”C with Classes”(使用类的C语言)也反映了这一点。

	随着 C++ 逐渐成熟,它变得更加丰富多彩,大胆前卫,它开始采纳一些与 “ 使用类的 C 语言 ”不同的编程策略。在构建函数时为达到不同目标, C++ 的发明者为其添加了异常处理机制(29 项);模板为设计思想注入了新的活力(41 项);同时, STL 使 C++ 达到了前所未有的可扩展度。
	今天的 C++ 是一门多重范型编程语言(mult-paradigmprogramming language),它包含面向过程(procedural)、面向对象(object oriented)、函数式编程(functional)、泛型(generic)、元编程(metaprogramming)等等特征。 这些能力和弹性使C++成为一个均可匹敌的工具,但这也会造成一些紊乱。所有的 “恰当的用法 ” 的准则似乎都存在例外。那么我们如何恰当的理解它呢?

	最简单的办法就是把 C++ 看作一个有若干门语言组成的联合体而非一门单独的语言。在一个特定的子语言中,规则就显得简单、直接,而且不易忘记。当你更换到另一门子语言时,规则就相应地改变了。为了理解 C++ ,你必须认清 C++ 主要的子语言。幸运的是,主要的子语言只有四门:

	1. C 。说到底C++仍是以C为基础。程序块(blocks)、语句(statement)、预处理器(preprocessor)、内置数据类型(built-in data types)、数组(arrys)、指针(points),等等都来自于 C 。在许多情况下, C++ 可以比 C 更优雅地完成一些任务(比如第 2 项(预处理的替代方法)和第13 项(使用对象管理资源)),但是当你发现你正在使用 “ C++ 中的 C ” 这一部分编写程序时,高效编程原则就会反映出 C 语言的局限:没有模板、没有异常处理、没有重载,等等。

	2.面向对象的C++(Object-OrientedC++)。这一部分的 C++ 就是 “ C with Classes ” 所诉求的:类(class)(包括构造和析构)、封装(encapsulation)、继承(inheritance)、多态(polymorphism)、虚函数(动态绑定),等等。这一部分的 C++ 是面向对象设计最为直接的应用,即类的规则。

	3. 包含模板的 C++ (templateC++)。这是 C++ 中泛型编程(generic programming)的一部分,大多数程序员经验最少的部分。模板的概念对 C++ 产生了深远的影响,(比如,第 46 项中介绍的通过调用模板函数简化类型转换)。模板如此之强大,它足以为我们带来了一个全新的编程范型:模板元编程 (template meta-programming, 简称 TMP) 。第 48 项是对 TMP 的一个简介,但是除非你对模板到了痴迷的地步,你大可不必投入过多精力。主流C++ 编程很少涉及到 TMP 规则。

	4.STL 。显然,STL 是一个模板库,但是它是一个非常特别的一个。它的约定使得容器(containers)、迭代器(iterators)、算法(algorithm)、函数对象(function object)完美地协同工作,当然模板和库也可以基于其它的想法来构建。 STL 有自己独特的办事方式,当你使用 STL 编程时,你必须要遵循它的约定。

	综上,高效编程守则要求改变策略时,从某个子语言切换到另一个并不为奇。例如:对内置类型而言,传值(pass by value)比传引用(pass by reference to const)更高效. 但是当你从 “ C++ 中的 C ” 迁移到 “ 面向对象的 C++ ” 后,构造函数和析构函数的存在就意味着pass by reference to const会更好。运用“template C++”时尤其如此,因为你此时甚至不知道处理对象的类型。然而使用 STL 时,迭代器和函数对象都是模仿C 语言中指针的机制,所以对STL的迭代器和函数对象而言, C语言的pass-by-value再次适用。(传参方式选择细节在第 20 项中介绍。)

	最后,请记住
C++高效编程规则的变化,取决于你使用C++的哪一部分。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值