这本电子书是在国科大上课时候,老师在课件资源里边提供的。之所以会重视这个文件,是因为本科时候,有个老师提到过:那个学生遍的代码很整齐,看起来让人舒服,我就知道工大留不下他。因此,我就格外注意这件事,但是没有认真搜索相关资料,现在有机会找到,当然会存下来。

学习C++已经有三个周期了,第一个周期学习的是简单MFC处理,也没有什么完整结果产出,倒是耗费了我两个周的时间去学一些例程。

第二个周期没学什么具体的方法,倒是对对象和类学得深入骨髓,对象和类就像月饼和模板的关系。有对象为什么会更快?就像盖楼一样,用砖头当然不如钢筋混凝土,而类的存在就是这“钢筋混凝土”,是相对来说更大的块。

第三个周期是真正的学习C++具体内容,把该掌握的基础语法都掌握了。这期间,我曾经想过抄袭,但还是咬牙把简单程序写完了,并且尽量做到“规整”,所以现在看到构造函数、虚函数等等有很具体的理解,入门也比较快。

学习笔记

不懂的地方

  • 如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

掌握的新内容

目录结构:

可将头文件保存于include 目录,将定义文件保存于source 目录(可以是多级目录)

  1. #include <math.h> // 引用标准库的头文件
  2.  
  3. #include myheader.h // 引用非标准库的头文件

  

变量赋值:

尽可能在定义变量的时候就进行赋值,可以防止后期忘记

空格:

对于表达式比较长的for 语句和if 语句,为了紧凑起见可以适当地去掉一些空格,如

  1.  for (i=0; i<10; i++)和if ((a<=b) && (c<=d))

我以前是不知道去掉空格的,用for的时候就很长。

指针型变量的写法:

  1. int *x, y; // 此处y 不会被误解为指针

注释:

【规则2-7-6】注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。

【规则2-7-8】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。

类的声明:

对于类的声明来说,先写public函数,以便用户看到:

我建议读者采用“以行为为中心”的书写方式,即首先考虑类应该提供什么样的函数。这是很多人的经验——“这样做不仅让自己在设计类时思路清晰,而且方便别人阅读。因为用户最关心的是接口,谁愿意先看到一堆私有数据成员!”

命名规则:

命名规则对我来说是新的,我以前在win程序和unix程序命名规则之间徘徊,现在有了明确的方案:

单字符的名字也是有用的,常见的如i,j,k,m,n,x,y,z 等,它们通常可用作函数内的局部变量。

  • 类的成员函数:

  【规则3-1-7】全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。
  类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。
  例如:

  1. DrawBox(); // 全局函数
  2. box->Draw(); // 类的成员函数

  

  【建议3-1-1】尽量避免名字中出现数字编号,如Value1,Value2 等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。

  • 完整规则:

【规则3-2-1】类名和函数名用大写字母开头的单词组合而成。

【规则3-2-2】变量和参数用小写字母开头的单词组合而成。

【规则3-2-3】常量全用大写的字母,用下划线分割单词。

【规则3-2-4】静态变量加前缀s_(表示static)。

【规则3-2-5】如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。

【规则3-2-6】类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。

【规则3-2-7】为了防止某一软件库中的一些标识符和其它软件库中的冲突,可以为各种标识符加上能反映软件性质的前缀。例如三维图形标准OpenGL 的所有库函数均以gl 开头,所有常量(或宏定义)均以GL 开头。

if语句:

  • 布尔变量不可以与零比较;
  • 整形变量可以与零比较,但是不能用“!a”的形式;
  • 不可将浮点变量用“==”或“!=”与任何数字比较;
  • 应当将指针变量用“==”或“!=”与NULL 比较,虽然NULL==0,但是应该将指针变量区分出来;
  1. if (condition)
  2. return x;
  3. return y;

是可用的,但是不规范,而且可以改为更简洁的表达方式:

  1. return (condition ? x : y);

循环语句的效率:

【建议4-4-1】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数。

【建议4-4-2】如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。


电子书前5章

学习时间:2PT

整理时间:1PT

2018年3月7日16:01:00

第7章 内存管理

主要了解了内存的三个区,以及指针和数组的区别,其中指针是指向某个地址,可以是变量也可以是常量,而数组是开辟一个空间并且赋值。

其中,函数在栈上生存,所以函数内的变量的地址是流动的,生存周期在这个函数内。

《高质量C++&C 编程指南》学习笔记的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  10. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...

随机推荐

  1. Django form表单功能的引用(注册,复写form.clean方法 增加 验证密码功能)

    1. 在app下 新建 forms.py 定义表单内容,类型models from django import forms class RegisterForm(forms.Form): userna ...

  2. Ubuntu 清除缓存 apt-get命令参数

    整理了Ubuntu Linux操作系统下apt-get命令的详细说明,分享给大家.常用的APT命令参数:apt-cache search package 搜索包apt-cache show packa ...

  3. python爬虫的scrapy安装+pymongo的安装

    我的:python2.7版本    32位 注意scrapy只支持2.7及以上的版本. 1.安装python 2.安装pip 安装pip就不赘述了,网上很多教学 pip安装时要注意更新,如果pip版本 ...

  4. c++ vector push_back对象的时候存起来的是拷贝

    比如 class C1; vector<C1> vec;C1* p=new C1;vec v1;v1.push_back(&(*p));delete p; 这里,传进函数的是引用, ...

  5. java程序启动redis报错ERR Client sent AUTH, but no password is set

    配置文件中注释掉password一句 重启程序即可

  6. 基于Linux环境,创建PHP后台守护进程(转载)

    应用场景:某些情况下,我们需要持续的周期性的提供一些服务,比如监控内存或cpu的运行状况,这些应用与客户端是没有关系的,不是说客户端(如web界面,手机app等)关闭了,我们就不监控内存或cpu了,为 ...

  7. AsyncContext的startAsync()方法开启异步

    Servlet 3.0的异步处理支持特性,使Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程.在接收到请求之后,Servlet 线程可以将耗时的 ...

  8. 使用 python 操作 mongodb 常用的操作

    pymongo 的安装命令 pip install pymongo. import pymongo 数据库及集合查询(创建) 连接数据库 查询数据库中的数据库 查询数据库中的集合 创建数据库和集合只需 ...

  9. skynet记录7:第一个服务logger和第二个服务bootstrap

    (1)logger是skynet_context_new创建:skynet_context及mq,模块create和init (2)bootstrap启动过程:snlua时一个lua的so,对应的sn ...

  10. LaTeX入门

    原写于我的洛谷博客,由于洛谷的\(\mathtt{markdown}\)编辑器和博客园的\(\mathtt{markdown}\)编辑器有点差别,所以实在懒得进行微调,就直接挂一个到洛谷博客的链接好了 ...