Item 1 将c++视为一个语言联邦

如今的c++已经是一个多重泛型变成语言。支持过程化,面向对象,函数式,泛型和元编程的组合。这种强大使得c++无可匹敌,却也带来了一些问题。所有“合适的”规则看上去都有例外。我们怎样理解这样一门语言?

最容易的方法是不要将其看成单一的一门语言而是将其看成是一个有相关性的语言的联邦。在一个特定的子语言中,一些规则就比较简单,明确并且容易记忆。当你从一个子语言切换到另外一个子语言时,这些规则可能会改变。为了更好的理解c++,你必须识别主要的子语言,幸运的是,只有四种子语言:

  • C.c++以c语言为基础。块,声明,预处理,内建类型,数组,指针等等。都来自于c语言。在许多情况下,c++只不过提供了一些比c高级的解法,但是当你发现你自己正在使用c++中的c语言部分时,高效编程的规则反映出c语言更多的局限性:没有模板,没有异常处理,没有重载等等。
  • 面向对象c++.c++这部分就是带类的c语言,主要包括:类(包括析构函数和构造函数),封装 ,继承,多态,虚函数(动态绑定)等等。
  • 模板c++.这是c++的泛型编程部分,也是大多数程序员在经验方面所欠缺的,关于模板编程的设计遍及整c++编程,一些好的编程规则中包含只适用于模板的条款。事实上,模板编程如此强大,它带来了一个新的编程范型,模板元编程(TPM).
  • STL.STL是一个模板库。它将容器,迭代器,算法和函数对象优雅的整合到一起,模板和库也可以用其他的方法构建出来。使用模板库有自己特殊的方式,当你在使用STL时,你必须遵循它的约定。

将这四种子语言记在心里,在不同的子语言之间进行切换时,高效编程可能需要变换策略,譬如,c语言中对于内建类型,按值传递比按引用传递要高效。在c++中,对于类对象来说,因为用户自定义的构造函数和析构函数的存在,按引用传递比按值传递要高效,模板c++中也是如此。但是在STL中,迭代器和函数对象是模仿的C语言中的指针,因此按值传递会比较高效。

因此c++不是统一标准的语言。它是一个语言联邦,每个子语言都有自己的约定。

转载请注明出处

读书笔记 effective c++ Item 1 将c++视为一个语言联邦的更多相关文章

  1. 读书笔记 effective c++ Item 12 拷贝对象的所有部分

    1.默认构造函数介绍 在设计良好的面向对象系统中,会将对象的内部进行封装,只有两个函数可以拷贝对象:这两个函数分别叫做拷贝构造函数和拷贝赋值运算符.我们把这两个函数统一叫做拷贝函数.从Item5中,我 ...

  2. 读书笔记 effective c++ Item 48 了解模板元编程

    1. TMP是什么? 模板元编程(template metaprogramming TMP)是实现基于模板的C++程序的过程,它能够在编译期执行.你可以想一想:一个模板元程序是用C++实现的并且可以在 ...

  3. 读书笔记 effective c++ Item 54 让你自己熟悉包括TR1在内的标准库

    1. C++0x的历史渊源 C++标准——也就是定义语言的文档和程序库——在1998被批准.在2003年,一个小的“修复bug”版本被发布.然而标准委员会仍然在继续他们的工作,一个“2.0版本”的C+ ...

  4. 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数

    关于构造函数的一个违反直觉的行为 我会以重复标题开始:你不应该在构造或者析构的过程中调用虚函数,因为这些调用的结果会和你想的不一样.如果你同时是一个java或者c#程序员,那么请着重注意这个条款,因为 ...

  5. 读书笔记 effective c++ Item 11 在operator=中处理自我赋值

    1.自我赋值是如何发生的 当一个对象委派给自己的时候,自我赋值就会发生: class Widget { ... }; Widget w; ... w = w; // assignment to sel ...

  6. 读书笔记 effective c++ Item 13 用对象来管理资源

    1.不要手动释放从函数返回的堆资源 假设你正在处理一个模拟Investment的程序库,不同的Investmetn类型从Investment基类继承而来, class Investment { ... ...

  7. 读书笔记 effective c++ Item 14 对资源管理类的拷贝行为要谨慎

    1. 自己实现一个资源管理类 Item 13中介绍了 “资源获取之时也是初始化之时(RAII)”的概念,这个概念被当作资源管理类的“脊柱“,也描述了auto_ptr和tr1::shared_ptr是如 ...

  8. 读书笔记 effective c++ Item 15 在资源管理类中提供对原生(raw)资源的访问

    1.为什么需要访问资源管理类中的原生资源  资源管理类是很奇妙的.它们是防止资源泄漏的堡垒,没有资源泄漏发生是设计良好的系统的一个基本特征.在一个完美的世界中,你需要依赖这样的类来同资源进行交互,绝不 ...

  9. 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式

    1. 一个错误释放内存的例子 下面的场景会有什么错? std::]; ... delete stringArray 一切看上去都是有序的.new匹配了一个delete.但有一些地方确实是错了.程序的行 ...

随机推荐

  1. 静态方法List

    public class Country { public static List<Country> CountryList = new List<Country> { new ...

  2. python_json常用的方法

    1. 什么是JSON? JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端 ...

  3. Thinking in scala (6)----高阶函数----返回一个函数

    在Thinking in scala (5)----高阶函数* 里面,我们演示了如何把一个函数作为参数传递给另外一个函数. 在本文里面,我们来演示函数式编程另外一个重要的特性:返回一个函数.首先来看这 ...

  4. CentOS根分区占满

    我中奖了!!! 查看硬盘的使用情况(bjchenxu)df -k 以K为单位显示df -h 以人性化单位显示,可以是b,k,m,g,t.. 查看各目录占用大小 du -sh * du -ms /*

  5. selenium Chromediver

    Here we use wget to fetch the version number of the latest release, then plug the version into anoth ...

  6. java系列--JSP的属性和内置对象

    一.JSP指令: <%@ 指令名 属性=" " %> 1.page指令 import属性 errorPage属性 language属性 session属性 isErro ...

  7. Python3基础 在print中用 %d 输出一个整数

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  8. 汇编语言实现led灯的跑马灯

    led实验1.看原理图 看设备工作的原理(可能需要阅读芯片手册),看设备与cpu的连接关系 GPIO具有输入输出功能.输入:cpu想知道io引脚是高电平还是低电平那么就是输入方式输出:cpu想控制io ...

  9. sql相关语言

    SQL 掌握一门编程语言: C C++ Java C# ... 数据库 数据结构/算法 链表 队列 栈 数组 面向对象 网络 (界面.业务逻辑) 关系型数据库: 以二维表的形式组织数据 表.索引.视图 ...

  10. YII 1.0 (7) 登录信息调取 session使用

    登陆信息调取 Yii::app()->user->name,调取登陆的session信息 登录时 调用了 $LoginForm->login() 这个方法上面就能够取到登录的用户名 ...