《C++ Primer》第二章要素太多?带你快速回顾里面少见的生僻点

举报
breakDawn 发表于 2022/03/08 00:19:01 2022/03/08
【摘要】 本文不提供任何详细笔记或者解释。 仅仅是为那些看过《C++ Primer》大块头第二章节,感觉信息量太大,希望快速回顾一些生僻点确认是否有遗漏的同学进行学习,一些过于基础的语法基本忽略。

本文不提供任何详细笔记或者解释。 仅仅是为那些看过《C++ Primer》大块头第二章节,感觉信息量太大,希望快速回顾一些生僻点确认是否有遗漏的同学进行学习,一些过于基础的语法基本忽略。
image.png


PS: 话说第二章看起来是基础章节,但是信息量相当巨大,很多人可能直接跳过了,却没注意到里面包含了大量的C++特殊用法。回顾自己N年前写C++的经历,发现下面内容的70%以上都没用过= =,几乎都是简单写法。。。


数据类型:

★long double 是96或128比特


★char与 signed char不一样, 实际上char表示为有符号还是无符号取决于编译器
因此不要用char去做运算,而应该做比较


★执行浮点数计算一般直接用double, 速度不比float慢,而且尽量不要用long double


★无符号整数和有符号整数相加, 有符号数变为无符号数(故不可以让负数与无符号数相加)


★没有空格,紧邻的2个字符串实际上是一个字符串“abcd"“adf”
故s=“afda”"dfaf"是合法的


★\123 是八进制的, \x123是十六进制的
\1234,则123是1个字符,4是一个字符


★可以通过添加后缀,来修改字面值(非变量 )的默认类型
例如
123默认为int
那么123U 则是无符号int
123UL 是无符号long
123ULL 是无符号long long

123.0默认为double
123.0F认为是float
123.0L认为是long double

对于字符
u’a’指16位
U’a’指3位

变量

★变量能存储数据,具有某种类型的内存空间。


★初始化不等于赋值, 赋值涉及擦除当前值


★int a = 0, 也可以是 int a(0)
C++11中可以用花括号来初始化变量。 叫做列表初始化
int a{0} 或者 int a = {0}
这个初始化会将丢失精度的初始化报错
例如 int a{1.2345},则会报错,因为会丢失精度


★内置类型(int double)等变量的初始化,如果是函数体外(全局),则初始化为0
在函数体内的则是未定义的值。所以最好每次定义变量时,都要初始化。
类的对象必须有初始化操作


★声明时如果初始化了,那么就变成了定义
extern int i, 则声明了i,但是没定义,i要在别的文件找
不可以extern int i =0, 因为这样extern就没有意义了


★C++是静态类型语言:编译阶段检查类型


★标识符规范:
变量名用小写字母开头
类名用大写字母开头
多个单词间用下划线区分,或者大写字母区分,但是记住,变量名是这样写studentIndex, 而不是StudentIndex
开头必须是字母或下划线,不可以是数字


★全局作用域和块作用域


★ 尽量不要让全局名字和局部名字相同

引用:

★引用必须初始化,不能重新绑定其他对象。
不能引用值,并且引用没有强制转换
int &val = 1 错
double dval=1.0
int &val = dval 错

指针

★空指针生成方法:
int *p=nullptr或0或NULL
尽量使用nullptr


★空指针在if判断中为false
非空指针在if判断中为true


★void *可以指向任何对象
但要使用时,必须要进行类型转换


★int* p1,p2, 则只有p1是指针,p2不是指针。


★&引用可以引用指针
但是指针不能指向引用&

常量

★const也必须初始化,不能改变


★若想在多个文件中共享全局const,则必须为每个const添加extern,即使是定义部分


★不能让普通引用 去引用常变量
const int ci
int &ri =ci 是错误的


★常量引用: const int &r2 = 恒定的数字或者变量
常引用干吗的?不能直接引用吗?
普通引用 int &b = a;
常量引用 const int &b = a;
a改变时, b的值都会改变
但是常量引用中,不可以执行b = x的操作,即只能a改变b,但是b不能改变a

同理, 普通指针不能指向常量
但是常量指针可以指向常量


★顶层const表示指针本身是个常量,即int *const p
底层cosnt表示指针指向的是常量, 即const int *p

  • 不能改变该名字的都叫顶层const
  • 能改变该名字,但是不能改变该名字所指向的东西,叫底层const
    当底层const作为赋值时,只能有底层const = 底层const
    或者底层const = 顶层const

但是不能其他引用或顶层const = 底层const


★const int sz = f()并非常量表达式, 因为它直到函数运行才知道结果
constexpr int a 与const int a相同,但是a必须是一个常量表达式,即他的值是确定的,而不是运行时才知道
constexpr int a = size()一定错误吗?
如果size()返回的也是constexpr int类型,说明大家的值都是一开始就可以初始化的,所以是对的


★constexpr能指的限制:
只能是算数类型、引用、指针,不能是其他乱七八糟的类
不能指向定义在函数体的变量(局部变量)
必须指向静态或者全局变量
必须是0,nullptr或者“固定”地址中的变量


★const int *p和constexpr int *q不同
前者是指向常量的指针,即指向处不可改
而后者等同于 int *const p, 即只对指针有效

其他

★别名:
typedef 旧名字 新名字
using 新名字 = 旧名字
typedef char* pc
则pc 就是 char *的别名
但是注意:
const pc cstr = 0, cstr是指向char的常量指针, cstr不可改, *cstr可改
而 cosnt char *cstr=0, cstr是指向char *的指针,*cstr不可改,cstr可改


★auto 自动确定类型
auto 某常量, 则忽略顶层const, 不认为是const
auto &某常量, 则认为是底层const, 即 指向常量的指针
想要顶层const, 则用 const auto


★decltype(函数 或者表达式) sum = x, 即decltype通过返回类型来判断类型,但是不会去计算答案


★decltype可以返回顶层const
decltype(p) 则返回p所指的类型, 如果*p=&i, 则类型就是int &
i是int, 则加了括号的decltype((i)) 是引用类型

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。