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

网友投稿 659 2022-05-30

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

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

数据类型:

★long double 是96或128比特

★char与 signed char不一样, 实际上char表示为有符号还是无符号取决于编译器

因此不要用char去做运算,而应该做比较

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

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

★没有空格,紧邻的2个字符串实际上是一个字符串“abcd"“adf”

故s=“afda”"dfaf"是合法的

★3 是八进制的, \x123是十六进制的

34,则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能指的限制:

只能是算数类型、引用、指针,不能是其他乱七八糟的类

不能指向定义在函数体的变量(局部变量)

必须指向静态或者全局变量

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

必须是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)) 是引用类型

C++ EI企业智能 可信智能计算服务 TICS 智能数据

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【鲲鹏经典直播征文】+openEuler内核热升级,业务不停机
下一篇:Lua 调试(Debug)
相关文章