前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【笔记】《C++Primer》—— 第2章

【笔记】《C++Primer》—— 第2章

作者头像
ZifengHuang
发布2020-07-29 15:54:57
5090
发布2020-07-29 15:54:57
举报
文章被收录于专栏:未竟东方白未竟东方白

这本书真是可怕,越看才越是知道自己欠缺的东西是有多么多...第二章又看到了很多不明白的东西,还有一些C11才带来的全新的概念,结果这篇可能会稍长一点,好多东西值得慢慢消化呢。

2.1

  1. 几个以前不知道的数据类型: wchar_t :确保可以存放机器最大扩展字符集中任意一个字符的“宽字符”,最小尺寸16位 char16_t 和char32_t :负责处理Unicode的字符类型 long double :C99出现的数据类型,特殊浮点需求的硬件可能会用到,与int和long int一样,是不确定精度的 long long :C11新增的类型,至少与long一样长的长长整形,可能是两倍的long长度
  2. 在类型名前增加unsigned就可以得到无符号类型,其中unsigned int可以缩写为unsigned。对应的signed可以得到有符号类型
  3. 字符类型char之类也有unsigned和signed的区别,但是char和signed char是不同的,char具体会表现成unsigned还是signed是要看编译器的
  4. 一点选择类型的小技巧: 当明确知道数值是正的时,选无符号型 整数一般使用int,否则使用longlong bool和char虽然可以自动转换为数字,但是最好不要使用 浮点类型最荐使用double,很多使用double的计算效率与float相差无几甚至有时会更快,long double的精度常常是不必要的反而带来了更大的计算消耗。除非对内存有很大要求XD
  5. 非bool类型的数转换时,0变为false,其余是true
  6. 浮点转整数会舍去小数部分
  7. 当给无符号数赋值超过其表达范围的值时,得到的结果会是那个数的取模
  8. 当给有符号数赋值超过其表达范围的值时,结果会是未定义的(undefined),非常危险
  9. 杂糅起来运算时,有符号数自动转为无符号数,负数会被取模
  10. 字面值常量默认是变为能容纳下的int以上的最小类型。short没有对应值
  11. 两个字符串之间若没有逗号等运算符隔开,将会自动合并为一个字符串,这一点可以用来让cout在代码中分行
  12. \v是纵向制表符,也就是在转移为下一列的情况下换行打印
  13. \f是换页符,一般效果类似换行符,有些终端会自动清空输出,在打印机上真的会换页打印

2.2

  1. 对于变量的初始化,变量的初始化在C++中可以广泛使用花括号了,称为列表初始化,这个第三章再写
  2. 定义在函数体外的内置变量会被初始化为0,但是定义在函数体内的变量将不被初始化(uninitialized),也就是仅仅有个个内存位置。
  3. 在分离式编译时,需要在不同文件中共享一个变量就需要声明它。如果想要声明而不定义一个变量(例如头文件中的变量),那就给它加上extern
  4. extern标记的变量将不能进行初始化
  5. 多文件中,变量只能被定义一次但是可以被声明很多次
  6. 自定义标识符(起名字)时,不能连续出现两个下划线,且开头的下划线不能紧接着大写字母,函数体外的标识符不能以下划线开头。
  7. 只有一个下划线作为标识符是合法的哦
  8. 尽量在要开始使用一个标识时才开始声明这个标识
2.3.1
  1. 在声明的变量标识符前加一个&号,这个标识符就成为指向其后的对象的引用(reference)。程序会将这个引用与后面的对象绑定在一起,从此以后这个引用就成为了后面的对象的别名
  2. 引用即别名!所有对引用的操作与对原对象的操作效果是都是相同的,它们会同时被改变,将引用作为原来变量的另一种表示就可以了
  3. 引用由于只能绑定在对象上,理解为只能绑定在有名称的对象上,所以不能与表达式或者字面值之类的匿名对象绑定
  4. 引用是必须初始化的,且引用一旦绑定了一个对象便无法解绑

2.3.2-2.3.3

  1. 指针是地址的储存,和引用不同,指针可以被赋值和拷贝,和其他内置类型一样,块作用域中定义的指针没初始化前它的值是不确定的
  2. 想要让指针指向一个对象需要给对象一个取地址符&,要使用指针所指的对象时,需要一个解引用符*
  3. 要时刻注意所使用的指针是不是空指针或无效指针(野指针)
  4. C11引入了专门的空指针关键字nullptr来替代C风格的预处理量NULL。其中nullptr是指针void*类型,NULL是整形int=0,虽然NULL也会被视作空指针但是有时候会出现区别,例如想要给函数传入空指针时,若函数的形参是void*,则无法传入NULL值的指针。
  5. 在很多情况下,使用nullptr来代替NULL都是更好的选择
  6. 建议:当不确定指针该有什么值时,也至少把指针初始化为NULL或nullptr
  7. 任何非0的指针对应的条件值都是true,nullptr是被作为0处理的,这点与NULL一致
  8. void*是一种特殊的指针,可以存放任意类型的对象的地址,称为无类型指针。对于void*来说,它指向的内存空间仅仅是内存空间,没有任何的类型意义。也就是基于这样的想法,不能直接操作void*指针所指的对象,因为编译器无法确定其所指的内存的类型
  9. 综合一下指针和引用的阅读方法:从右向左进行阅读,左边的符号是用于修饰右边的,一层层向外解析
  10. 也就是在上一点的情况下,将*和&符写得紧贴变量名是不错的写法,更方便阅读。但实际上两者并没有什么高低之处

2.4

  1. const是个复杂的关键字,含义是指定所修饰的变量无法修改,也就是让其变量成为只读
  2. 由于const修饰的变量一旦创建就不可以改变,所以const必须被初始化,也只能对const采取不改变其内容的操作
  3. 之所以一旦创建就不可以改变,是由于const在链接时会被编译器优化为指向内存固定常量区域的变量,拥有同样值的变量会被指向同一个const内存,且这块内存也有特别优化。在这点上const就比C风格的define有个很大优势,const速度更快,更节省内存,还享用和其他变量相同的类型检查优势。define由于是在预处理阶段进行简单的文字替换的预处理操作,所以使用相同define的变量也会申请自己的内存,define还由于是文字替换所以没有类型检查。define比起const的好处可能只有define可以用来快速得到计算式小函数之类
  4. 数组也可以使用const作为申请的长度直接初始化
  5. 当需要在多文件中共享一个常量时,最好的做法是在一个单独的文件中定义一个const并加上extern符,然后在需要使用的文件中声明这个const且也加上const符
  6. 可以用const修饰引用,被修饰的引用所引用的必须也是常量或字面值之类不可修改的量
  7. 被const修饰的引用是指不可利用这个引用来修改原来的变量,但是还是可以直接修改原来的变量
  8. 相似的,const也可以给指针使用,其所指的是此指针本身的地址值不可以改变,但是依然可以改变指针所指的对象的值利用这个指针
  9. const有分顶层const和底层const之别,但是实际上仔细从右到左分析const的修饰就可以理解
  10. 我们有时候需要用const指向还没被计算出来的常量表达式,但是在巨大的系统中有些表达式我们很难判定是不是常量表达式,C11引入了constexpr关键之来强制指定一个表达式是常量表达式,不是时无法通过检查
  11. 指针和引用都可以被定义为constexpr,但是指针的初始值必须是0之类的固定内存内的值

2.5

  1. 传统中想要声明类型别名(type alias)使用的是typedef关键字,在C11中又引入了别名声明(alias declaration),关键字using,其作用是将等号左侧的名字规定为右侧类型的别名
  2. 在绝大多数时候using与typedef都是相同的,例外是using可以给模板类声明别名而typedef不行,C11里建议使用using来代替typedef
  3. C11引入了自动推断类型的关键字auto,使用很简单,就是auto可以利用等号右边的式子自动得到其类型和值,这个过程在编译中得到
  4. auto会顺便进行变量的赋值,所以auto必须要初始化
  5. auto会忽略掉顶层const
  6. 要注意一点就是*和&是属于标识符而不是数据类型,会被auto忽视,但是总而言之auto的出现使得程序的编写变得舒服了很多,不用再去人脑推断出复杂的数据类型了
  7. 更方便的是,有时候我们只想推导数据类型而不需要赋值,可以使用C11以后出现的decltype关键字,他会使用其后的括号内的函数/表达式的返回类型来推导类型,且会保持顶层const和引用
  8. 要注意的是如果表达式是decltype((x)),则返回的类型永远是引用,而没有双层括号时才是按照x本身状态来判断
  9. C11引入了一个新特性,struct可以在结构内定义默认值了
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未竟东方白 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档