第二章:变量和基本类型

  笔记:

    1. c++语言规定一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。其中,数据类型long long是在c++11中新定义的。

    2. 执行浮点运算选用double,这是因为float通常精度不够而且双精度浮点和单精度浮点数的计算代价相差无几。

    3. 切勿混用带符号类型和无符号类型。其中,带符号数会自动地转换成无符号数。

    4. 转义序列以反斜线作为开始,如\n、\t、\"、\'。也可以使用泛化的转义序列,如\7(响铃)、\12(换行符)、\x4d(字符M)。形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字。参考ASCII码。

    5. 指定字面值的类型,如L'a'(类型是wchar_t)、u8"hi!"(utf-8字符串字面值)、1E-3F(单精度浮点型字面值,类型是float)。

    6. c++语言中,初始化和赋值时两个完全不同的操作

    7. c++11新标准中,用花括号来初始化变量得到了全面应用,被称为列表初始化(list initialization)。这种初始化有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息的风险,则编译器将报错。如:

    long double ld = 3.1415926536;int a{ld}, b = {ld};   //错误:转换未执行,因为存在丢失信息的危险int c(ld), d = ld;        //正确:转换执行,且确实丢失了部分信息

    8. 定义在函数体内部的内置类型将不被初始化(uninitialized)。

    9. 建议初始化每一个内置类型的变量。

    10. c++支持分离式编译,即允许将程序分割为若干个文件,每个文件可被独立编译

    11. 声明使得名字呗程序所知,而定义会申请存储空间,还可能为变量赋一个初始值。只声明用关键字extern。

    extern int i;   // 声明i而非定义iint j;             // 声明并且定义jextern double pi = 3.1415;  //定义

    12. 变量能且只能被定义一次,但是可以被多次声明。

    13. (a)作用域分为全局作用域块作用域,定义于main函数之外变量具有全局作用域。(b)作用域能彼此嵌套,被包含的作用域称为内层作用域(inner scope),包含着别的作用域的作用域称为外层作用域。(c)作用域中一旦声明了某个名字,它所嵌套着的所有作用域中都能访问到该名字。(d)同时,允许内层作用域中重新定义外层作用域中已有的名字,来覆盖外层名字。而在内层作用域中可以用::reused来访问外层名字。

    14. 定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用,而且引用只能绑定在对象上,引用即别名

    15. 空指针(null pointer)用NULL、0、nullptr来表示,字面值nullptr是新标准刚引入的一种方法。最好使用nullptr。

    16. 引用本身并非是一个对象,而指针是一个存储地址的对象

    17. 类型别名(type alias)是一个名字,它是某种类型的同义词。用关键词typedef。新标准规定一种新方法,使用别名声明(alias declaration)来定义类型别名。关键字using。如:

      typedef double wages;typedef wages base, *p;   // p是double*的同义词using SI = Sales_item;     // SI是Sales_item的同义词

      类型别名重难点理解:

      typedef char *pstring;const pstring cstr = 0;   // cstr是指向char的常量指针,顶层constconst pstring *ps;         // ps是一个指针,它指向的对象是指向char的常量指针

    18. c++11新标准引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。因为编译器通过初始值推断出变量的类型,所以auto定义的变量必须有初始值

    19. c++11新标准引入另一种类型说明符decltype,它的作用是选择并返回操作数的数据类型,编译器分析表达式并得到它的类型,却不实际计算表达式的值。如:

      decltype(f()) sum = x;

    20. c++11新标准规定,可以为类中数据成员提供一个类内初始值(in-class initializer)。如:

    struct Sales_data{std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;};

    21. 类通常被定义在头文件中,而且类所在头文件的名字应与类名字一样。

    22. 确保头文件多次包含仍能安全工作的常用技术是预处理器(preprocessor),如:

    #ifndef  SALES_DATA_H#define SALES_DATA_H#include <string>struct Sales_data{std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;};#endif            

    23. 通常将头文件中类的名字来构建保护符的名字,以确保唯一性,且名字全部大写

  重点知识点总结:

  待补充知识点:decltype类型指示符。  

  c++中const限定符

    1. 允许一个常量的引用半丁非常量的对象、字面值,甚至是一个一般表达式。

    2. 允许另一个指向常量的指针指向一个非常量。

    3. 顶层const表示指针本身是一个常量,而名词底层const表示指针所指的对象时一个常量。

    4. 底层cosnt的限制不能忽视,拷贝时,对象必须具有相同的底层const资格或者两个对象的数据类型必须能够转换,一般来说,非常量可以转换为常量,反之不行。

    如:

    /* 范围1cosnt int ci = 1024;const int &r1 = ci;    //正确:引用机器对象都是常量r1 = 41;      //错误:r1是对常量的引用int &r2 = ci;    // 错误:试图让一个非常量引用指向一个常量对象*//*范围2int i = 42;const int &r1 = i;    //正确(常用):允许将const int& 绑定到一个普通int对象上const int &r2 = 42;    // 正确:r2是一个常量引用;编译器会将其绑定到一个临时对象上const int &r3 = r1 * 2;    //正确:r3是一个常量引用int &r4 = r1 * 2;    // 错误:r4是一个普通的非常量引用*//*范围3int i = 0;int *const p1 = &i;   // 不能改变p1的值,这是一个顶层constconst int ci = 42;     //  不能改变ci的值,这是一个顶层constconst int *p2 = &ci;  // 允许改变p2的值,这是一个底层constconst int *const p3 = p2;  //靠右的const是顶层const,靠左的是底层constconst int &r = ci;     // 用于声明引用的const都是底层const

  术语

    转义序列(escape sequence)、类型说明符(type specifier)、作用域(scope)、复合类型(compound type)、

    引用(reference)、预处理变量(preprocessor variable)、常量表达式(const expression)、类型别名(type alias)、

    预处理器(preprocessor)、头文件保护符(header guard)。

    术语解释:

    常量表达式(const expression):指值不会改变并且在编译过程就能得到计算结果的表示式。

                                                 2016-10-25 19:32:34

转载于:https://www.cnblogs.com/wzhe/p/5997817.html

c++ primer 5th 笔记:第二章相关推荐

  1. C++Primer读书笔记----第二章变量和基本类型

    前段时间学习iphone开发,非常力不从心,很多C/C++的类库代码看不明白.大学的时候都学过C/C++,但是基本上忘光了,现在做C#开发,经常写出来一些性能低下的代码,究其原因就是原理掌握不扎实,乱 ...

  2. C++ Primer 读书笔记 - 第二章

    1. 这章谈到了初始化和赋值其实是不同的,这使我想起了构造函数中的普通构造函数,拷贝构造函数,赋值构造函数,详见博文C++中的构造函数与析构函数 string这个类有default construct ...

  3. 深入理解 C 指针阅读笔记 -- 第二章

    Chapter2.h #ifndef __CHAPTER_2_ #define __CHAPTER_2_/*<深入理解C指针>学习笔记 -- 第二章*//*内存泄露的两种形式1.忘记回收内 ...

  4. 《Go语言圣经》学习笔记 第二章 程序结构

    Go语言圣经学习笔记 第二章 程序结构 目录 命名 声明 变量 赋值 类型 包和文件 作用域 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记,几乎是书上的内 ...

  5. Web前端开发笔记——第二章 HTML语言 第四节 超链接标签

    目录 前言 一.超链接标签 (一)链接其它子网页 (二)链接其它站点 (三)虚拟超链接 二.从当前页面链接到指定位置 三.链接的访问情况 四.在新窗口中打开链接 例题 结语 前言 本节介绍超链接标签即 ...

  6. 《计算传播学导论》读书笔记——第二章文本分析简介

    <计算传播学导论>读书笔记--第二章文本分析简介 第一节 文本分析研究现状 常用文本挖掘技术 第二节 文本分析与传播学研究 (一)为什么文本挖掘技术逐渐受到传播学者的关注 (二)不同文本分 ...

  7. Computational Optimal Transport 笔记——第二章(2)

    Computational Optimal Transport 笔记--第二章(2) 符号说明 2. 理论基础 2.3 Kantorovich Relaxation SUM 2.4 Optimal T ...

  8. PhalAPI学习笔记 ——— 第二章接口服务请求

    PhalAPI学习笔记 --- 第二章接口服务请求 前言 接口服务请求 接口服务请求案例 自定义接口路由 开启匹配路由 配置路由规则 nginx apache 服务请求 结束语 前言 公司业务需要转学 ...

  9. 操作系统笔记 第二章

    操作系统笔记 第二章 1.有两个程序:A程序按顺序使用CPU10秒.设备甲5秒.CPU5秒.设备乙10秒.CPU10秒:B程序按顺序使用设备甲10秒.CPU 10秒.CPU5秒.设备乙5秒.CPU 5 ...

  10. JavaSE入门0基础笔记 第二章Java基础语法

    JavaSE入门0基础笔记 第二章Java基础语法 1.运算符 1.1算术运算符 1.1.1运算符和表达式 1.1.2 算术运算符 1.1.3字符的"+"操作 1.1.4 字符串中 ...

最新文章

  1. 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性
  2. ORA-01109:数据库无法启动问题
  3. 【图像处理】数字图像处理之颜色
  4. android入门知识,android基础知识学习笔记
  5. Java中的策略设计模式-示例教程
  6. composer-安装插件包
  7. “通讯录不属于用户隐私”?今日头条:绝对不认可这个说法
  8. Python 文档学习
  9. 关于eclipse中maven项目的问题
  10. CFS 调度器数据结构篇
  11. php扩展intl安装不成功,phpstudy开启php_intl扩展启动弹出错误的解决方法
  12. 网上银行储存管理系统总结报告
  13. ES6阮一峰读书笔记第三章字符串的拓展
  14. validate 属性
  15. Win11系统Windows.old能删除吗?Windows.old怎么删?
  16. 主分区与逻辑分区的区别
  17. java下载excel(excel含有多张网络图片)
  18. 谈谈我当韭菜的投机经历
  19. 苹果手机怎样用计算机打开快手,快手手机电脑怎么连接
  20. php str splice,PHP array_splice()函数使用方法

热门文章

  1. html5 滤色,深入理解CSS mix-blend-mode滤色screen混合模式
  2. 使用ORM数据库:greenDao
  3. 内部同步 外部同步 java_如何用匿名内部类实现 Java 同步回调
  4. 前端开发的浏览器知识
  5. C~K的班级(II)_JAVA
  6. c++ 调用 ffmpeg 编程
  7. 微软OCR两层优化提升自然场景下的文字识别精度(模式识别新研究)
  8. Git命令按人统计提交次数和代码量
  9. Java 面试知识点解析(六)——数据库篇
  10. 神经网络入门(最通俗的理解神经网络)