《C++ Primer》读书笔记 第二章——变量、引用、指针、常量和类型

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a799581229/article/details/79968782
(写在前面:该读书笔记摘录C++ primer中需要注意的知识点,是普通大学课程里或者常见面试题里比较少提到的知识点)

数据类型:
★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
开头必须是字母或下划线,不可以是数字


★全局作用域和块作用域

:★:abc ,  则引用了全局的变量abc
尽量不要让全局名字和局部名字相同

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


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

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

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

★lint* p1,p2, 则只有p1是指针

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


常量
★lconst也必须初始化,不能改变
★l若想在多个文件中共享全局const,则必须为每个const添加extern,即使是定义部分

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


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

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

★l顶层const表示指针本身是个常量,即int *const  p
底层cosnt表示指针指向的是常量,   即const int *p
不能改变该名字的都叫顶层const
能改变该名字,但是不能改变该名字所指向的东西,叫底层const
  当底层const作为赋值时,只能有
底层const = 底层const
或者底层const = 顶层const

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

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

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

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



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


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


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

★ldecltype可以返回顶层const
decltype(*p) 则返回*p所指的类型, 如果*p=&i, 则类型就是int &
i是int,  则加了括号的decltype((i)) 是引用类型
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页