前言

刚开始的时候只学习了一些简单的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. jekyll bootstrap搭建github blog

    前提你必须有一个GitHub账号且本机安装有Git 一.创建一个新的仓库 去你的https://github.com主页新建一个仓库 名字为USERNAME.github.com USERNAME为你 ...

  2. C#通过系统API判断已经连接互联网

    win32   API函数的做法: 要用的函数:InternetGetConnectedState 函数原形:BOOL   InternetGetConnectedState(LPDWORD   lp ...

  3. lua及luci学习

    由于项目需要对Luci进行修改,所以这里开始地luci进行较深入的研究. 探索其中的运行路径. Openwrt默认的HTTP服务器为uhttpd,该WEB服务器是由Luci的开发者自行开发的,非常小巧 ...

  4. [翻译]初识SQL Server 2005 Reporting Services Part 1

    原文:[翻译]初识SQL Server 2005 Reporting Services Part 1 构建和部署基本报表 如果曾经存在一项工作使得“真正的”开发者给他的上司泡蘑菇,那就是构建报表.毕竟 ...

  5. 查看mysql状态常用命令

    最近服务器上mysql有些奇奇怪怪的问题,可惜我不是专业的dba,为了加深自己对mysql的了解,先从基础的查看mysql状态命令看起吧. 命令: show status; 命令: show stat ...

  6. c#下载文件案例

    public static void HttpDown(string fileName, System.Web.UI.Page p_Page,string floder) { string path ...

  7. CString转换为const char*

    CString str=_T("这是我的测试程序.");// 先得到要转换为字符的长度const size_t strsize=(str.GetLength()+1)*2; // ...

  8. 实现 ready和bind事件

    Jquery揭秘系列:实现 ready和bind事件   讲这一节之前,先回顾之前的一篇<小谈Jquery>里面的代码: (function (win) { var _$ = functi ...

  9. MVC test

    1,index @{ ViewBag.Title = "Index"; } <!DOCTYPE html> <html> <head> < ...

  10. 替换__thread的一种方式,实现TLS功能

    TLS是由于多线程编程带来的产物,主要是为了解决线程资源局部化,具体内容网上有很多介绍.有很多地方已经支持了该功能,但有些地方没有,下面是GCC的一些介绍,反正具体看实际使用情况: 5.51 Thre ...