C++程序设计语言第六章——类型与声明

c++作为强类型编程语言,任意一个变量都要有类型,说明了类型才有后续的运算。主题上可分为内置类型(基本类型、指针、引用)和用户自定义类型(枚举类型、类)。

一、基本类型:布尔值类型、字符类型、整数类型、浮点数类型、void类型
布尔值类型:
布尔值可以转化为整数,即true—1和false—0;并且布尔值做算术逻辑运算时自动转为整数
整数也可以隐式的转化为布尔型,非0转为true,0转为false;比如,while(1),1转化为true
指针可以隐式转为布尔型,非空指针转为true,空指针转为false ;比如,if(p)

字符类型:
字符类型属于整形,因为字符集中的每一个字符对应于一个整数,可以用int(c)得到整数值。属于整形,自然能做算术逻辑运算了,char转为int,若想将结果再变为char,用static_cast<char>。
字符集:ASCII、UNICODE等
字符类型:char、signed char、unsigned char 。(普通char和特定char的区别在于与实现有关或者无关)
通常,认为char是由8位二进制数构成的,char转化为整数的时候,得到的值是0-255或是-127-127取决于机器实现,机器中的char是无符号的,取值在0-255;c++通过定义signed char和unsigned char来指明字符对应的整数类型,signed char 有符号字符值在-127-127,unsigned char无符号字符值在0-255。
字符字面值常量:每个字符字面值常量对应于字符集中的一个整数。
常用转义字符:\n \r \t ? ’ " \

整数类型:
int (有符号int)、signed int 、unsigned int
short int 、int、long int、long long int
整数字面值常量分为八进制(0开头)、十进制、十六进制(0x开头)
字面值常量该如何分配存储空间呢?
字面值常量的类型由其形式、取值、后缀共同决定,后缀越明确越好。
对于十进制表示的常量数据来说,类型不会是unsigned ;但是以八进制、十六进制表示类型可能就是unsigned ,具体的实现时会选择满足能够表达常量的最小尺寸。
后缀:ull 、ul、ll、l

浮点数类型:
double 、float 、long double
浮点数的字面值常量默认是double类型,若希望表达float类型的浮点常量,常量值加后缀f。

void:
两种用途:函数的返回值(表示函数返回值为空),指针类型(表示所指向的对象类型是未知的)

二、声明
声明将类型和名字关联起来,定义是为实体提供所需的信息(包括分配内存空间并为其赋初值),使用实体前必须先定义。

2.1声明语句结构:
可选的前置修饰符:(比如,static 、virtual,指明声明对象的非类型属性)
基本类型
可选的声明符,由名字和可选的声明运算符构成,有*(指针)、const(常量指针)、&(左值引用)、&&(右值引用)、[](数组)、()(函数),后缀声明作用效果比前缀声明效果更显著,比如,charp[] 指针数组 和char (*p)[] 指向数组的指针,通过加()改变声明级别
可选的后缀函数修饰符
可选的初始化器或函数体。

声明函数和命名空间时,不以分号结束;同时声明多个变量时,声明运算符只作用于最紧密的变量,最好一条声明语句只写一个变量。
2.2 名字
作用域范围较大时,使用含义明确的实体名,作用域范围小时,多使用简短约定俗成的实体名;、用户自定义的类型首字母大写,实体名用小写,宏定义中用大写,用下划线将实体名中的多个单词隔开,标准库中的类型名都是用小写表达的。
作用域:
全局变量不用i或x等常用的变量名。
块内声明的变量能隐藏外层块及全局变量中的同名变量,若希望能访问到同名全局变量,使用::,最好不使用同名变量。
函数的形参作用域在函数体内,因此函数体内不可再定义与形参同名的变量名。
for()中的变量作用域在执行体内,因此在一个函数体内的多个for可用相同变量名。

2.3初始化
避免使用未初始化的变量
{}列表初始化,可防止窄化。
比如,int x{3}
空初始化列表{}指定使用默认值进行初始化。
对于全局变量、名字空间变量、局部static 、static成员,没有指定初始化器,将默认执行空的初始化列表器来为变量赋默认值;而对于局部变量和动态对象,没有指明初始化列表,就不进行初始化。

2.4推断类型:
根据初始化器或是函数返回类型进行推断,即auto和decltype(expr),decltype常用在泛型表达中。
auto 根据赋值对象来推断被赋值对象类型,使用初始化列表器时,其类型为initializer_list,因而被赋值对象类型为list,对于 auto x=1 和auto x{1}来说,第一个推断x为int类型 ,第二个推断x为int列表,包含一个元素。因而,对于确定的被赋值对象来说,用初始化列表{}更好,可以防止窄化;对于推断类型的auto来说,初始化时用=更安全。
auto 对象可以加const、&等修饰符

2.5变量的生命周期
自动变量:从定义起被创建,超出范围被销毁。自动变量存储在栈中,每调用一次函数,获得新的栈帧以存放变量。
静态变量:地址唯一、创建并初始化一次。
自由存储变量:由new和delete控制变量生命周期。

2.6 类型别名
为某个类型重起名字
using newName=已有的类型名

猜你喜欢

转载自blog.csdn.net/m0_37937932/article/details/86561231