C++程序设计与语言(特别版) -- 导论
前言
刚开始的时候只学习了一些简单的C++语法知识,当C++不再是一门学科需要考试的时候,就想重新把C++捡回来,希望从中学习到一点思想性的东西而不再是一些语法性的东西。
下面都是一些参考书目的摘抄或者自己的一点想法。
第1章 致读者
1.6.1 给C程序员的建议
- 在C++里几乎不需要宏。用const或enum定义明显的常量,用inline避免函数调用的额外开销,用template去刻画一族函数或者类型,用namespace去避免名字冲突。
- 不要再你需要变量之前去声明它,以保证你立即对它进行初始化。声明可以出现在能出现语句的所有位置上,可以出现在for语句的初始化部分,也可以出现在条件中。个人觉得就是在动作发生时才去声明变量,一来提高代码可读性,二来避免污染或者未初始。
- 不用用malloc()。new运算符能将同样的事情做得更好。对于realloc(),请试一试vector()。
- 试着去避免void*、指针算术、联合和强制,除了在某些函数或类实现的深层之外。在大部分情况下,强制都是设计错误的指示器。如果必须使用某个显示的类型转换,请设法去用一个“新的强制”,设法写出一个描述你想做的事情的更精确的语句。
- 尽量少用数组和C风格的字符串。与传统的C风格相比,使用C++标准库string和vector常常可以简化程序的设计。
如果要符合C的链接规则,一个C++函数就必须被声明为具有C链接的。
1.8 忠告
- 在编程序时,让程序的结构尽可能地直接反映这些思想:类--独立概念;对象--独立的实体;抽象类--共同的界面;基类--实现有些显著的共同东西;模板--一种对象的容器;模板函数--对某容器的一个算法;名字空间--类,模板等相互之间有逻辑联系。
- 在定义一个并不是实现某个像矩阵或复数这样的数学对象的类时,或者定义一个低层的类型如链接表的时候:不要使用全局数据,不要使用全局函数;不要使用公用数据成员;不要使用友元,除非避免前两个。
第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++程序设计与语言(特别版) -- 导论的更多相关文章
- C++程序设计语言(特别版) -- 一个桌面计算器
前言 这里要介绍各种语句和表达式,将通过一个桌面计算器的程序做些事情,该计算器提供四种座位浮点数的中缀运算符的标准算术运算. 这个计算器由四个部分组成:一个分析器,一个输入函数,一个符号表和一个驱动程 ...
- c++学习书籍推荐《C++程序设计语言(特别版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <C++程序设计语言(特别版•十周年中文纪念版)>编辑推荐:十周年纪念版,体味C++语言的精妙与魅力,享受与大师的心灵对话.1979年,Biarn ...
- c++学习书籍推荐《面向对象程序设计:C++语言描述(原书第2版)》下载
百度云及其他网盘下载地址:点我 <面向对象程序设计:C++语言描述(原书第2版)>内容丰富,结构合理,写作风格严谨,深刻地论述了c++语言的面向对象编程的各种技术,主要内容包括:面向对象编 ...
- 《VB语言程序设计(第3版)》总结
我之前因学习昆仑通态的组态软件MCGS,用并学习过VB,还买了一本书<VB语言程序设计(第3版)>.现在在某公司实习,最近接触老的项目,又要用到VB.我就又把那本书大体看了一遍,并对其进行 ...
- 《C语言程序设计(第四版)》阅读心得(一)
本篇开始写我个人觉得谭浩强老师的<C语言程序设计(第四版)>中之前没有认识到,或者忘了的知识.因为本科学过,所以有些简单的东西就没有放进来了,所以可能并不是太全面. 第一章程序设计与语言 ...
- 浙大版《C语言程序设计(第3版)》题目集 --总结
浙大版<C语言程序设计(第3版)>题目集 此篇博客意义为总结pta上浙大版<C语言程序设计(第3版)>题目集所做题目的错误点,心得体会. 1.练习2-10 计算分段函数[1] ...
- 《JavaScript高级程序设计(第3版)》阅读总结记录第一章之JavaScript简介
前言: 为什么会想到把<JavaScript 高级程序设计(第 3 版)>总结记录呢,之前写过一篇博客,研究的轮播效果,后来又去看了<JavaScript 高级程序设计(第3版)&g ...
- [转]win 10 开始菜单(Win 7风格)增强工具 StartIsBack++ v1.3.4 简体中文特别版
Windows10开始菜单增强工具StartIsBack++现已更新至v1.3.4,最近主要修复在Win10周年更新版上恢复睡眠后任务栏通知中心按钮消失的问题.升级版对StartIsBack+全新构建 ...
- JavaScript高级程序设计(第三版)学习,第一次总结
Array类型 var arr = []; arr.length; //返回数组元素个数 改变length可以动态改变数组大小 检测数组 instanceof可以检测某个对象是否是数组,限制:只能是一 ...
随机推荐
- Session变量不能转移到下页.解决: session.use_trans_sid = 1
附:文摘 ============================================================ 在PHP使用SESSION的朋友可能会碰到这么一个问题.SESSIO ...
- android音乐播放器开发 SweetMusicPlayer
智能负载直插式歌词
在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773.假设没有本地歌词怎么办?如今来将 ...
- Manager(管理器)
Manager(管理器) 索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):Manager 模式的示例实现. 意图 将对一个类的所有对象的管理封装到一个单独的管理器类中. 这使得管理职责的 ...
- [置顶] 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!
前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...
- r.js实践
r.js合并实践 项目中用到require.js做生产时模块开发,但上线要合并压缩,幸好它配套有r.js.下面就其用法说明一下. 首先建一个目录,里面的结构如下: require.js可以到r.js项 ...
- Content Negotiation(内容协商)
Asp.Net Web API 2第十四课——Content Negotiation(内容协商) 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http:// ...
- 手机APP下单支付序列图
今天安装了Visio,学习了下如何使用,画了一下公司现在项目的下单支付序列图,话就不多说了,直接上图,处女作,欢迎指正!
- MVC应用程序请求密码的功能1
MVC应用程序请求密码的功能(一) 经过一系列的练习,实现了会员注册<MVC会员注册>http://www.cnblogs.com/insus/p/3439599.html,登录<M ...
- 用Haproxy给MySQL做负载均衡
1.安装 # wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.24.tar.gz # tar zcvf haproxy-1.4.24.t ...
- [google面试CTCI] 1-8.判断子字符串
[字符串与数组] Q:Assume you have a method isSubstring which checks if one word is a substring of another G ...