C++ Primer 5th学习笔记1 变量和基本类型

1、变量

  类型转换转换的过程:

  • 非bool型的算术值赋值给bool类型,初始值为0则结果为false,否则结果为true
  • bool赋值给非bool,初始值为false时,结果为0;初始值为true,结果为1

  cpp语言规定的转义序列:

名称 符号 名称 符号 名称 符号
换行符 \n 横向指标符 \t 报警符 \a
纵向制表符 \v 退格符 \b 双引号 \"
反斜线 \\ 问号 \? 单引号 \’
回车符 \r 进纸符 \f

  指定字面值的类型:

前缀 含义 类型
u Unicode 16字符 char16_t
U Unicode 32字符 char32_t
L 宽字符 wchar_t
u8 UTF-8(仅用于字符串字面常量) char

  变量命名规范:

  • 标识符要能体现实际含义。
  • 变量名一般用小写字母
  • 自定义的类名一般用大写字母开头

  引用(此处是左值引用):为对象起另外一个名字,即只是名字,但是还是共用这个值的大小,通过将声明符写成&d的形式来定义引用,如下:

int val = 1024;
int &refVal = val;		//refVal指向val(是val的另外一个名字)

注意:

  • 引用必须被初始化;
  • 初始化完成之后,引用将和初始值绑定在一起
  • 引用类型的初始值必须是一个对象,不能是数值
  • 引用的类型对象必须是相同的,int型对象必须对应int型引用

2、指针

  指针:实现对其他对象的间接访问,特点:1、其本身是一个对象,允许对指针进行赋值和拷贝;2、指针无须在定义时赋值。定义形式:*d,例如:

int val = 34;
int *ptr = nullptr;
int *p = &val;		//p存放变量val的地址(p指向变量va的指针)

指针的值的4种状态:

  • 指向一个对象
  • 指向紧邻对象所占空间的下一个位置
  • 空指针,即指向任何对象
  • 无效指针,上述情况之外的其他值

指针赋值语句的判断:改变了指针的值?还是指针所指向的对象
eg:

int *pi = nullptr;
int val = 34;
pi = &val;		//pi的值被改变,pi指向了val
*pi = 12;		//val的值被改变,指针p未改变,即pi指向的对象发生了改变

const 限定符
定义该变量使其值不能改变。默认状态下,const对象仅在文件内有效。
对于const变量,不管是声明还是定义,都在前加 extern 关键字,这样定义一次即可。
const引用:将引用绑定到const对象上,称之为对常量的引用,对常量的引用不能被用作修改它所绑定的对象
示例:

const int ci = 1024;
const int &r = ci;	//引用及其对应的对象都是常量

const指针
(1)顶层const(常量指针):把*放在const关键字之前来说明指针是一个常量,即不变的是指针本身的值而非指向的那个值。
(2)底层const(指针常量):把*放在const关键字之后来说明指针的值是一个常量,即不变的是指针所指向的值而非本身的地址值。
示例:

int num1 = 0,num1 = 1;
int *const cur1 = &num1;		//1
int const *cur2 = &num2;		//2
const double pi = 3.14;
const double *const pip = π		//pip是一个指向常量对象的常量指针

  对上述1和2的理解:
  cur1是一个地址为“常量”(固定值)的指针,即不能改变cur1的地址,如指针的cur1++cur1--操作,但是能够修改*cur1的值,如对其赋值*cur1 = 1;,此时num的值也随之修改。也就是(1)的结论。
  cur2是一个指向的值为常量的指针,即不能够修改*cur2的值,如对其赋值*cur2 = 3;,但是,可以改变cur2的地址,如指针的cur2++cur2--操作,也就是(2)的解释
  弄清楚上述声明最有效的方法就是从变量名开始,从右至左阅读。离cur1最近的是const,所以cur1是一个常量,前面符号是*,因此cur1是一个常量指针(指针的地址是常量)。同理,对于cur2,最近的是*,所以cur2是一个指针,指针前面加上const修饰,故cur2是一个指针常量(指针指向的值是常量)。

tip:在C++11中,允许将变量声明为constexpr类型来由编译器验证变量的值是否是一个常量表达式
示例:

constexpr int mf = 20;

3、decltype类型指示符

作用:选择并返回操作树的数据类型
  decltype和auto的区别:decltype的结果类型与表达式形式相关。有一种情况注意:对于decltype所用的表达式,变量名加上括号与不加括号,得到的类型会不同。若decltype使用的是一个不加括号的变量,得到的结果即改变量的类型;若给变量加上一层或多层括号,编译器会当其作为一个表达式
  注意:decltype((variable))(双层括号!!!)的结果永远是引用,而decltype(variable)结果只有当variable本身就是一个引用时才是引用

猜你喜欢

转载自blog.csdn.net/qq_18150255/article/details/88384121