前言

刚开始的时候只学习了一些简单的C++语法知识,当C++不再是一门学科需要考试的时候,就想重新把C++捡回来,希望从中学习到一点思想性的东西而不再是一些语法性的东西。

下面都是一些参考书目的摘抄或者自己的一点想法

第1章 致读者

1.6.1 给C程序员的建议

  1. 在C++里几乎不需要宏。用const或enum定义明显的常量,用inline避免函数调用的额外开销,用template去刻画一族函数或者类型,用namespace去避免名字冲突。
  2. 不要再你需要变量之前去声明它,以保证你立即对它进行初始化。声明可以出现在能出现语句的所有位置上,可以出现在for语句的初始化部分,也可以出现在条件中。个人觉得就是在动作发生时才去声明变量,一来提高代码可读性,二来避免污染或者未初始。
  3. 不用用malloc()。new运算符能将同样的事情做得更好。对于realloc(),请试一试vector()。
  4. 试着去避免void*、指针算术、联合和强制,除了在某些函数或类实现的深层之外。在大部分情况下,强制都是设计错误的指示器。如果必须使用某个显示的类型转换,请设法去用一个“新的强制”,设法写出一个描述你想做的事情的更精确的语句。
  5. 尽量少用数组和C风格的字符串。与传统的C风格相比,使用C++标准库string和vector常常可以简化程序的设计。

    如果要符合C的链接规则,一个C++函数就必须被声明为具有C链接的。

1.8 忠告

  1. 在编程序时,让程序的结构尽可能地直接反映这些思想:类--独立概念;对象--独立的实体;抽象类--共同的界面;基类--实现有些显著的共同东西;模板--一种对象的容器;模板函数--对某容器的一个算法;名字空间--类,模板等相互之间有逻辑联系。
  2. 在定义一个并不是实现某个像矩阵或复数这样的数学对象的类时,或者定义一个低层的类型如链接表的时候:不要使用全局数据,不要使用全局函数;不要使用公用数据成员;不要使用友元,除非避免前两个。

第2章 C++概览

2.3 过程式程序设计

  • 原始的程序设计范型是:

    确定你需要哪些过程;采用你能找到的最好的算法。

2.4 模块程序设计

  • 模块程序设计的范型变成了:

    确定你需要哪些模块;将程序分成一些模块,使数据隐藏于模块之中

2.4.1 分别编译

  • 分别编译的使用并不是语言要考虑的问题,而是关于如何最好地利用特定语言实现的优点的问题。分别编译就是把实现(.c),界面(.h),使用(.c)分离。感觉以前对.h的理解就是把界面和实现都放在了一起,把.h简单地理解成代码的分离和重用。
  • 最好的方式就是最大限度地模块化,通过语言特征去逻辑地表示模块化,而后通过能最有效地分别编译的一组文件,物理地利用这种模块化机制。

2.5.1 定义类型的模板namespace

  • 基于模板的程序设计趋向于以一个类型的所有数据为中心,在某个类型管理模板的控制之下工作。
  • 某个实现可以是预先分配几个堆栈,...这种做法常常不是最理想的。一个重要问题就是,这里给用户提供了一个“假类型”的表示,它可以因为表示类型不同而出现很大变化——而与此同时又应该将用户隔离于这一表示之外。
  • 更根本的问题是,通过模板实现的这种用户定义类型,他们说提供的对这种类型的访问,在行为上,并不像内部的类型。他们得到的支持也与内部类型不同,而且实际上更少一些。这里理解不是很透彻,是因为包装多个堆栈相比于单个堆栈提供了更少的方法,一些控制的方法无法在外部实现,灵活性低;还有就是容易造成歧义的原因吗?

2.5.2 用户定义类型class

  • 用户定义类型程序设计范型变成了:

    确定你需要哪些类型,为每个类型提供完整的一组操作。
  • 这里出现了friend,以前不理解友元的作用,这里专门去补了一下。1.首先类具有封装和信息隐藏的特性。只有类成员函数才能访问类的私有成员,但是多次调用某些成员函数会影响程序的运行效率;2.为了解决这个问题,友元是一种定义在类外部的普通函数或类,但它需要在类内进行说明,但是它可以访问类中的私有成员。3.它破坏了类的封装性和隐藏性,导致程序可维护性变差。(一提到可维护性就怕怕)

2.5.4 抽象类型

  • 在将Stack从一个用模板实现的“假类型”转变成为一个真正的类型的过程中,有一个性质被丢掉了:表示方式没有与用户界面分离,反而变成了使用Stack的程序片段里讲包含的一个部分。
  • 如果我们需要将堆栈的用户与堆栈表示的修改完全隔离开,这时需要放弃的就是真正的局部变量。virtual表示“可以在今后由这个类说派生的类里重新定义”。

2.5.5 虚函数

  • 怎样将虚函数的调用正确解析为函数的定义?一种常用的思想技术是让编译器在一个virtual函数的名字转换为指向这些函数的指针表的下标。这种表通常被称为“虚函数表”(vtbl)。每个带有虚函数的类都有标识着它的所有虚函数的vtbl。
  • 调用者需要知道的所有东西就是Stack的那个vtbl的位置,以及对各个虚函数应该使用的下标。其空间开销是带有虚函数的类的每个对象里包含一个指针,而每个这样的类需要一个vtbl。

2.6 面向对象的程序设计

  • 作者首先提了一个需要一直switch的例子,引出了继承的作用。
  • 现在程序设计范型是:

    确定你需要哪些类;为每个类提供完整的一组操作;利用继承去明确地表示共性。

2.7 通用型程序设计

  • 这个程序设计范型是:

    确定你需要哪些算法;将他们参数化,使他们能够对各种适当的类型和数据结构工作。

第3章 标准库概览

3.5.1 C风格的字符串

  • 一个C风格的字符串就是一个以0字符结束的字符数组。函数c_str()能够以C风格字符串的形式提取出string的值。

3.7.1 向量——vector

  • 这里提到了()和[]的区别,圆括号是n个向量,中括号是n个空向量的数组。
  • vector是一种能赋值的简单对象。当向量存有许多元素时,这种看起来无害的赋值和初始化的代价也可能很高。

3.7.5 标准容器

标准库容器 说明
vector 变长向量
list 双向链表
stack 堆栈
queue 队列
deque 双端堆栈
priority_queue 按值排序的队列
set 集合
multiset 值可重复集合
map 关联数组
multimap 关键字可重复的关联数组

3.8.1 迭代器的使用

  • 这里出现了typename,继续补概念吧。假设有一个T::iterator *iter,T必须等到模板实例化时才会知道是哪种类型,更不用说内部的iterator,它可能是静态数据成员,静态成员函数或嵌套类型。嵌套类型的话就是T下的一个结构,但是如果是静态数据成员,iter就是一个函数。这样就会产生歧义。为了避免这种情况,typename告诉编译器这是类型而不是变量。

3.8.6 标准库算法

下面是其中觉得特别有用的东西

标准库算法 说明
for_each() 对每个元素调用函数
find() 找出参数的第一个出现
find_if() 找出第一个满足谓词的元素
count() 统计元素的出现次数
count_if() 统计与谓词匹配的元素
replace() 用新值取代元素
replace_if() 用新值取代满足谓词的元素
copy 复制元素
unique_copy() 复制元素,不重复
sort() 对元素排序
equal_range() 找到所有具有等价值的元素
merge() 归并排序的序列

总结

  • 讲道理,对这一章的消化还不是很清楚,估计以后还要回头细看。

C++程序设计与语言(特别版) -- 导论的更多相关文章

  1. C++程序设计语言(特别版) -- 一个桌面计算器

    前言 这里要介绍各种语句和表达式,将通过一个桌面计算器的程序做些事情,该计算器提供四种座位浮点数的中缀运算符的标准算术运算. 这个计算器由四个部分组成:一个分析器,一个输入函数,一个符号表和一个驱动程 ...

  2. c++学习书籍推荐《C++程序设计语言(特别版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计语言(特别版•十周年中文纪念版)>编辑推荐:十周年纪念版,体味C++语言的精妙与魅力,享受与大师的心灵对话.1979年,Biarn ...

  3. c++学习书籍推荐《面向对象程序设计:C++语言描述(原书第2版)》下载

    百度云及其他网盘下载地址:点我 <面向对象程序设计:C++语言描述(原书第2版)>内容丰富,结构合理,写作风格严谨,深刻地论述了c++语言的面向对象编程的各种技术,主要内容包括:面向对象编 ...

  4. 《VB语言程序设计(第3版)》总结

    我之前因学习昆仑通态的组态软件MCGS,用并学习过VB,还买了一本书<VB语言程序设计(第3版)>.现在在某公司实习,最近接触老的项目,又要用到VB.我就又把那本书大体看了一遍,并对其进行 ...

  5. 《C语言程序设计(第四版)》阅读心得(一)

    本篇开始写我个人觉得谭浩强老师的<C语言程序设计(第四版)>中之前没有认识到,或者忘了的知识.因为本科学过,所以有些简单的东西就没有放进来了,所以可能并不是太全面. 第一章程序设计与语言 ...

  6. 浙大版《C语言程序设计(第3版)》题目集 --总结

    浙大版<C语言程序设计(第3版)>题目集 此篇博客意义为总结pta上浙大版<C语言程序设计(第3版)>题目集所做题目的错误点,心得体会. 1.练习2-10 计算分段函数[1] ...

  7. 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介

    前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...

  8. [转]win 10 开始菜单(Win 7风格)增强工具 StartIsBack++ v1.3.4 简体中文特别版

    Windows10开始菜单增强工具StartIsBack++现已更新至v1.3.4,最近主要修复在Win10周年更新版上恢复睡眠后任务栏通知中心按钮消失的问题.升级版对StartIsBack+全新构建 ...

  9. JavaScript高级程序设计(第三版)学习,第一次总结

    Array类型 var arr = []; arr.length; //返回数组元素个数 改变length可以动态改变数组大小 检测数组 instanceof可以检测某个对象是否是数组,限制:只能是一 ...

随机推荐

  1. Canvas入门(3):图像处理和渲染文本

    资源:http://www.ido321.com/997.html 一.图像处理(非特别说明,全部结果均来自最新版Google) 在HTML 5中,不仅能够使用Canvas API绘制图形,也能够用于 ...

  2. leetcode第30题--Next Permutation

    problem: Implement next permutation, which rearranges numbers into the lexicographically next greate ...

  3. REST 测试工具

    两款 REST 测试工具 用CURL命令行测试REST API 无疑是低效率的,这里把最近使用的两款 Chrome 插件总结下 POSTMAN 简单易用 REST Console 功能强大 使用的话用 ...

  4. Markdown的使用

    原文:http://wowubuntu.com/markdown/ git:https://gitcafe.com/riku/Markdown-Syntax-CN/ 记录一下Markdown的使用,I ...

  5. 优秀Python学习资源

    优秀Python学习资源收集汇总(强烈推荐)   Python是一种面向对象.直译式计算机程序设计语言.它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮 ...

  6. JobTracker等相关功能模块初始化

    [Hadoop代码笔记]Hadoop作业提交之JobTracker等相关功能模块初始化 一.概要描述 本文重点描述在JobTracker一端接收作业.调度作业等几个模块的初始化工作.想过模块的介绍会在 ...

  7. 用自己的话表达出来-Servlet

    什么是Servlet Servlet就是工作在服务器端的类,该类可以处理用户传过来的请求,也可以通过响应向用户输送数据. 如何使用Servlet Servlet就是处理用户的HTTP请求,然后回送HT ...

  8. net破解一(反编译,反混淆-剥壳,工具推荐)

    net破解一(反编译,反混淆-剥壳,工具推荐) 大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以 ...

  9. markdown实现

    博客园文章markdown实现   博客园也可以使用markdown写博客了~_~ 实现方法 在博客园管理-设置-页首Html代码中加入: <!-- Markdown --> <sc ...

  10. Elmah错误日志工具

    Elmah错误日志工具 Exception 对于异常的处理,以前基本就是跳转到一个自定义的错误页面,觉得这样不错挺友好的.同时还是需要记录下来这些异常,才能进一步的进行修改. 怎么去记录这些错误信息呢 ...