基本类型
算数类型
包括:整型和浮点型
字符型
-
无符号
unsigned int,unsigned long....
-
有符号
char,short,int,long....
-
类型转化
- 小尺寸可以往大尺寸转;大尺寸往小尺寸转,则会丢失精度
- 尽量避免赋值超过类型范围
-
计算时,无符号和有符号一起计算
-
无符号类型比有符号类型尺寸大或者相等,都会先转成无符号类型
unsigned int x = 10; int y = -20; >> x+y = 4294967286;
-
无符号类型比有符号类型尺寸小,则都会先转成有符号类型
unsigned int x = 10; long y = -20; >> x + y = -10;
-
布尔类型
-
true,false
只要数据不为0,那么就是true;true的值为1
bool b = 42; // b为真 int i = b; //i为1
字面量常量
- 形如42这样的称为字面量常量
- 字面量常量的类型:从int开始,能容纳下当前值范围的最小尺寸
如果指定类型,就会使用指定的类型,如42L,就是long类型,不再是默认的int类型了
- 严格说,十进制字面量不会有负数,比如-42,是42的字面量常量前面加了负号
- 字符和字符串字面量:字符串字面量是实际是常量字符构成的数组,并在结尾处默认添加了
\0
转义序列
有特殊含义的字符,如' " ?
等,需要转义序列才能正常输出,转义序列以``开始
复合类型
指基于其他类型定义的类型
引用
分为左值引用和右值引用 一般说引用都是指左值引用
-
形式
int i = 1021; //定义一个变量 int &rel = i; //定义这个变量的引用
-
引用只是为对象取了一个别名,并没有新建对象
-
引用在定义时必须初始化,和一个初始值绑定在一起,之后都无法再次绑定成别的对象 如
int &rel; //这样会报错,引用必须初始化
-
引用的初始值必须是一个对象,不能是字面量或者表达式的计算结果
-
获取引用的值,就是在获取与引用绑定的值;为引用赋值,就是在给引用绑定的变量赋值
int i = 10; int &val = i; //定义并初始化引用 //此时获取val的值,就是在获取i的值,即10 int j = 20; val = j; //给val赋值,就是在给i赋值,i会修改为j的值,也就是20
指针
-
形式
int i = 10; //定义变量i int *p = &i; //定义变量p,p是指向的是i的地址 *p = 10; //访问p保存的地址指向的对象,也就是i,为i赋值成10
-
和引用的异同点
-
相同:都能实现对其他对象的间接访问
-
不同点
- 指针本身就是一个变量,可以赋值,拷贝,也修改为指向其他的变量
- 指针无须再定义时初始化,没有初始化的指针,拥有一个不确定的值
-
-
&
和*
符号的多重含义&
可以用作定义引用;也可以用作取地址*
可以用作定义指针;可以用作取指针指向的对象 -
空指针,用
nullptr
表示,也可以使用字面量0来生成空指针int *p1 = nullptr; int *p2 = 0;
-
注意
- 建议初始化所有的指针,避免可能出现无法预期的错误
- 试图访问一个无效的指针会引发程序错误,如空指针
- 指针可以比较大小,因为指针存放的是变量的地址值,就可以比较两个地址的大小,如果值相同,那么指针相等
- 一种特殊的指针:
void*
,可以存放任意的地址,使用时可以转成任意的地址来操作
复合类型的声明
-
规律:从右往左理解,和变量名最近的描述符,表明了变量的类型
int *p; // 定义指针p int *&x = p;
从右向左,先看到x,再看到&,表明x是一个引用;再看到*,表明x是一个对指针的引用,最后int,表明x是一个对int类型数据的指针的引用
-
一行定义多个变量 :类型修饰符都只修饰最近的一个变量
int *p; // 定义指针p int *&x = p;
变量
变量定义
-
形如
int x = 10;
这样,就是定义变量x
,10是x
的初始值,所以这也同时对x
进行了初始化 -
如果只是
int x;
就只是定义了变量,并未对变量初始化但是对于定义在函数外的任何变量,会有默认的初始值,都会被初始化为0。如int
就是0,bool
就是false等;但是建议手动初始化每一个内置类型的变量,保证程序可靠性函数体内的变量不会被初始化,需要手动初始化,不初始化直接使用可能会引发错误初始化的含义是创建变量时赋予其一个初始值
-
如果是
int x; //这一步是定义变量 x = 10; //这一步就是给变量赋值了
赋值的含义是把对象的当前值擦除,而以一个新值来替代
-
变量初始化方式
int x = 10;
int x(10);
int x = {10};
int x{10};
后两种称为列表初始化,相比其他形式,有重要特点: 如果列表初始化且初始值存在精度丢失风险,那么编译器会报错
int x{3.14d},y = {3.14d} //错误 int x(3.14),y = 3.14 //正确,丢失精度
变量声明
-
如果一个文件想使用别处定义的变量,就需要再自己文件中声明这么变量
-
形式:添加关键字
extern
,并且不要显示初始化:extern int j;
-
变量声明规定了变量的类型和名字 但是定义还会申请内存,也可能赋予初始值
-
包含显示初始化就是定义,就算加了
extern
,extern
也会失效extern int i = 10; 这就是定义
- 在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误
- 变量能且只能被定义一次,但是可以被多次声明
-
变量作用域
-
C++语言大多数作用域都是以花括号{}分割
- 类成员变量,作用域就在类的花括号内
- 方法内的变量,作用域就在方法的花括号内
- 类或者方法内的代码块中的变量,作用域就在代码块的花括号内
-
嵌套作用域
- 内层花括号内可以访问外层花括号定义的变量,反过来则不行
- 内层作用域中定义的变量会覆盖外层作用域定义的同名变量,但是尽量不要同名,会对理解代码造成干扰