C++_2. 变量和基本类型

2.1基本内置类型

类型:基本内置类型、复合类型(指针、引用)、标准库类型(string、vector等)、自定义类型。基本内置类型包括算术类型和空类型。算术类型分为整型(字符、布尔类型)和浮点型。
计算机以比特序列存储数据,每个比特是二进制(0或1);字节是可寻址的最小内存块,大多数机器字节是由8个比特构成;字是基本存储单元(4或8个字节)。
带符号和无符号
int、short、long、long long 都是带符号的,无符号的类型前加unsigned。unsigned int缩写为unsigned。

2.1.3 字面值常量

字面值常量是一望而知的值,每个字面值常量都有对应的数据类型。
1.整型和浮点型字面值
整型字面值

//数值20表示
20 /*十进制*/	024 /*0开头,表示八进制*/		0x14 /*0x开头,表示十六进制*/

整型字面值得具体数据类型,由它的值和符号决定。
浮点型字面值
小数或者指数,指数部分用E或e标识。

 a = 1e10;	b = 25.;	c = .5;	
 d = 6.023e23; //6.023*10的23次方

2.字符和字符串字面值
单引号括起来叫字符字面值,双引号括起来叫字符串字面值。字符串字面值的类型是有由常量字符构成的数组。

'a'	//字符字面值
"Hello World!"	//字符串字面值,实际类型是数组。

3.布尔字面值和指针字面值
true和false是布尔型字面值,nullptr是指针字面值,标识空指针。

2.2 变量

变量初始化方式

int i =0;
int i={0};	//列表初始化方式。
int i(0);
int {0};	//列表初始化方式。

列表初始化方式用于内置类型时,如果初始值存在丢失信息的风险,编译器将报错。

long double id=3.1415926;
int a{id};	//错误:转换未执行,因为存在信息丢失的风险。

默认初始化
默认初始化的默认值由变量的类型以及变量的位置决定。对于内置类型的变量,默认初始值是由位置决定。函数体之外的内置类型变量默认初始化为0,函数体之内的内置类型变量未定义。
声明和定义
显式初始化的声明成为定义。使用关键字extern,是声明一个变量。
标识符
命名规范:变量名用小写字母开头;自定义类用大写字母开头。

2.3 复合类型

复合类型:引用、指针……
变量声明语句:基本数据类型+声明符列表(类型修饰符:&或
+变量名)。*

2.3.1 引用

引用不是对象,是和初始值对象一直绑定在一起的,对象的另一个名字。引用必须用对象初始化,引用的类型和绑定的对象类型一致。

int &refVal14= 10;	//错误:引用初始化必须是对象。
double daval = 3.14;
int &refVal15 = daval;	//错误:引用类型与对象类型不一致。

2.3.2 指针

指针是对象,在指针生命周期内可以指向不同的对象;指针无需再定义时赋初值。除了两种情况,指针类型都要和指向对象严格匹配。

double daval;
double *pd = &daval;	//pd指向double型对象daval的指针。
int *pd1 = &daval;	//错误:指针类型和指向对象类型不一致。

空指针
空指针不指向任何对象。

int *pi
pi = 0;	//pi是空指针。
if (pi)
	……	//0为false,非0值为ture。

void*指针
void* 指针可以存放任意类型对象的地址。正因为我们对存放地址的对象类型不了解,所以不能确定可以对这个对象进行的操作行为。
指针的引用

int i = 42;
int *p;	
int *&r = p;	//r是一个引用,引用的是指针,指针类型是整型。

复合类型理解:右向左,离变量最近的类型修饰符对变量有最直接的影响。r是一个引用。其余部分确定r引用的类型是什么,*说明引用的是一个指针。声明的基本数据类型部分,指出r引用的是一个int指针。

2.4 const 限定符

const 对象一旦创建,其值不能被改变。所以,const 对象必须初始化,并且对对象的操作不能改变其内容。

int i = 2;
const int ci = i;
int j = ci;	//正确,并未改变i的值。

2.4.1 const的引用

const int ci =1024;
int &r1 =ci;	//错误:对象是const,引用也必须是const,类型需要一致。
const  &r2 =ci;
r2 =42;	//错误:改变了const对象的值。

引用类型和引用对象的类型一致,但两种情况除外:①初始化常量引用时,允许用任意表达式(非常量对象、字面值、一般表达式)作为初始值,只要该表达式的结果可以转换成引用的类型。②……

int ci =1024;
const int &r1 =ci;	//正确:r1是常量引用。

const对象、const引用。const引用虽然可以引用非const对象,但也不允许改变引用对象的值。

int i =42;
const &r1 =i;
r1= 0;	//错误:r1是const引用,不允许改变引用对象的值。

小结:const对象必须使用const引用,const引用不一定是const对象。但是,只要是const引用,就不允许通过const引用改变对象的值。

2.4.2 指针和const

小结:const对象必须使用cons指针,const指针不一定是const对象。但是,只要是const指针,就不允许通过const指针改变指向对象的值。
常量指针本身是一个const对象,必须初始化。一旦初始化完成,存放的地址值不能改变,即不变的是指针本身的值而不是指向的值。

int i=0;
int *const r1=&i;	//r1是一个常量对象,对象的类型是指针,指针指向int对象i。

理解:从右向左,离变量最近的类型修饰符对变量有最直接的影响。r1是一个const对象,对象的类型由声明符的其余部分确定。其余部分确定对象是一个常量指针。基本数据类型确定常量指针指向int对象。

2.4.3 顶层const

顶层const:表示任意的对象(算数类型、类、指针)是常量;底层const:是指针和引用等复合类型的基本类型部分有关,表示指针所指的对象是常量。

const int *const p3=p2;	//p3是个常量对象,顶层const。靠左的是底层const。
const int &r =ci;	//底层const,用于声明引用的都是底层const。

2.4.4 constexpr

常量表达式,是指值不会改变并且在编译过程就得到计算结果的表达式。字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。对象或表达式是不是constexpr是由数据类型和初始值共同决定。
如果认定一个变量是常量表达式,直接声明成constexpr类型。

constexpr int mf =20;	//20是常量表达式。

constexpr和指针
constexpr声明语句中如果定义指针,限定符constexpr仅对指针有效,与指针所指的对象无关。

const int *p = nullptr;	//p是指向常量的指针
constexpr int *p = nullptr;	//p是常量指针(等价int *const p)。

猜你喜欢

转载自blog.csdn.net/weixin_43205866/article/details/89366416