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可以检测某个对象是否是数组,限制:只能是一 ...
随机推荐
- JSP之项目路径问题(${pageContext.request.contextPath},<%=request.getContextPath()%>以及绝对路径获取)
本随笔这是作为一个记录使用,以备后查.项目完成之后本地部署OK,本地Linux部署OK,都可以正常的访问,可是当我把它部署到服务器上面的时候,首页可以正常访问,可是当发出请求的时候却报错误了,说找不到 ...
- WebIM(4)----Comet的特殊之处
WebIM系列文章 在一步一步打造WebIM(1)一文中已经使用Comet实现了一个简单的WebIM,那么,Comet究竟和一般的打开网页有何区别,本文将通过编写一个简单的HTTP服务器来说明两者的区 ...
- Solr高亮与Field权重
Solr高亮与Field权重 Solr高亮 原理 做搜索时,高亮是很常见的需求,那么Solr肯定也为高亮提供了支持.先解释下Solr高亮的原理,在我们设置了需要高亮显示的Field之后,查询得到的 ...
- 我的Android 4 学习系列
Android 简介 开始入手 创建应用程序和Activity 创建用户界面 Intent 和 Broadcast Revicever 使用 Internet 资源 文件,保存状态和首选项 数据库和C ...
- ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork 制作一个添加新闻功能
本文将交大伙怎么集成ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork来制作一个新闻系统 先上截图: 添加页面如下: 下面来看代码部分 列表页如下: @ ...
- CSDN 高校俱乐部: 排列搜索
CSDN 高校俱乐部/英雄会 题目: 设数组a包含n个元素恰好是0..n - 1的一个排列,给定b[0],b[1],b[2],b[3]问有多少个0..n-1的排列a,满足(a[a[b[0]]]*b[0 ...
- PHP gbk转换成utf8
/** * GBK ASCII 转换成utf8 */ public function to_utf8($str){ $detect = array('ASCII', 'GBK', 'UTF-8'); ...
- float的深入剖析
float的深入剖析 float是什么? float即为浮动,在html中的作用是使元素脱离正常的文档流并使其移动到其父元素的“最左边”或“最右边”.下面解释下这个定义中的几个名词的概念: 文档流 ...
- ASP.NET MVC 之Model的呈现
ASP.NET MVC 之Model的呈现(仅此一文系列三) 本文目的 我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index: public class H ...
- Eclipse plugin web site 发布和版本更新
Eclipse plugin web site 发布和版本更新 在eclipse插件开发过程中免不了要发布1.0, 1.1, 1.2…….等等,随着版本的递增,假如每次都发布一个插件zip包,那使用者 ...