《C++ Primer》第二章要素太多?带你快速回顾里面少见的生僻点
本文不提供任何详细笔记或者解释。 仅仅是为那些看过《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"是合法的
★\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)) 是引用类型
- 点赞
- 收藏
- 关注作者
评论(0)