第二章 变量和基本类型
2.1.基本内置类型(算数类型和空类型)
2.1.1 算数类型(整型(包括字符与布尔类型在内))
计算各种大小(class、struct、union)
2.1.2 类型转换
2.1.3 字面值常量
称之为字面值是因为只能用它的值称呼它,称之为常量是因为它的值不能修改。并且每个字面值都有相应的类型。
整型和浮点型字面值
默认的浮点字面值常量为 double 类型。
字符和字符串字面值
转义序列
指定字面值的类型
布尔字面值(true/false)和指针字面值(nullptr)
2.2 变量
对象:一块能存储数据并具有某种类型的内存空间。
2.2.1 变量定义
声明&定义
为了允许把程序拆分成多个逻辑部分。C++支持分离式编译。为了支持分离式编译,C++语言把声明与定义区分开。声明规定了变量的类型和名字,但定义申请了存储空间,也可能会为其附一个初始值。
在函数体内部,不能初始化一个由extern关键字标记的变量。
初始化&赋值
定义的方式
int test=0;
int test(0);
int test={0};
int test{0};
作为C++11新标准的一部分,使用花括号来初始化变量得到了全面应用。这种形式称为列表初始化。对于内置类型的变量,如果使用列表初始化且初始值存在丢失信息的风险,则编译器将报错。
默认初始化
如果定义变量时未指定初始值,则变量被默认初始化,默认值由变量类型与位置有关。内置类型定义在任何函数体之外的变量默认初始化为0;定义于函数体之内的内置变量不被初始化。每个类各自决定其初始化对象的方式。
2.2.3 标识符(字母、数字和下划线组成,必须以字母或下划线开头)
2.2.4 名字的作用域
2.3 复合类型(基本数据类型 声明符列表)
2.3.1 引用(左值引用/C++11右值引用)
引用为对象起了另一个名字,不同于普通的初始化,定义引用初始化时,引用与初值绑定在一起,而不是将值复制给引用,一旦初始化完成,引用无法再绑定另一个对象,因此引用必须初始化。
2.3.2 指针
不同于引用,指针本身是一个对象,允许赋值和拷贝,在生命周期可以指向不同的对象,无需在定义时初始化。
野指针/空指针
空指针
void* 指针(无法获取内存空间中的对象)
2.3.3 理解复合类型的声明
指向指针的引用(int*&r=p)
2.4 const限定符
默认状态下,const对象仅在文件内有效。
2.4.1 const的引用
初始化和对const的引用:引用的类型必须与其所引用对象的类型一致,但有两个例外:
(1)初始化常引用时允许用任意表达式作为初值,只要该表达式可以转换成对应的类型。
double pi = 3.14;
const int &p = pi;
本质:
double pi = 3.14;
const int temp=pi;
const int &p = temp;
(2)对const的引用可能是一个非const的对象
const int a=0;
const int &b=a;
int &c=a;//错误;可以通过c修改a,const a无意义
int d=0;
const int &e=d;
2.4.2 指针和const(类比const与引用)
2.4.3 顶层const
2.4.4 constexpr和常量表达式
constexpr定义一个指针,限定符只对指针有效,对所指对象无效。
constexpr int*p=nullptr;//p是指向整数的常量指针
2.5 处理类型
2.5.1 类型别名(typedef)
2.5.2 auto类型说明符
2.5.3 decltype类型指示符
2.6.3 编写自己的头文件