(一)基本内置类型:算数类型(arithmetic type)和空类型(void type)
*算数类型分为:整型(integral type)和浮点型(float type),其中整型包括字符和bool类型。
如图:
*带符号型(signed)和无符号型(unsigned)
除去扩展型和bool型,其他整性可以划分为带符号型和无符号型。带符号型可以分为正数,负数,零,无符号型只能表示大于零的数。可以直接添加unsigned 符号得到无符号类型。如 unsigned int,unsigned long.
* 类型装换(convert)
给带符号类型赋值一个超出其表示范围的值,其结果是未定义的(undefined)
给无符号类型赋值一个超出其表示范围的值,其结果是初始值对无符号类型表示总数取模后的余数。
*含有无符号类型的表达式
带符号数会自动转化成无符号数。(此处应该看计算机组成。。。。)
*字面值常量(literal)
*转义序列(escape sequence)
(二)变量(variable)
变量提供一个具名,可供操作的存储空间。
对象(object)指一块能存储数据并具有某种类型的内存空间。
*变量的定义
基本形式为,类型说明符(type specifier)+一个或多个变量名组成的列表;
初始化(initialized)<初始化不是赋值,初始化指创建变量时赋予一个初始值,赋值指把对象当前的值擦除,而已一个新值来代替>
初始化的不同方式:列表初始化(list initialized),默认初始化(default initialized)
如果是内置类型未被显示初始化,值由它所在的位置决定。位于任何函数体之外的初始值为0,函数体内部初始值不被初始化(uninitialized)。任何未被初始化的内置类型都是未定义的,如果试图拷贝或已其他方式访问都将出错。
变量申明和定义的关系
为支持分离式编译(separate compilation),可以使用extern 将定义(definition)和申明(declaration)分开。
标识符(identifier)
名字作用域(scope)
内层作用域(inner scope),外层作用域(outer scope),::作用域操作符
(三)复合类型(compound type)
引用和指针
引用(reference)为对象起了另外一个名字,引用类型引用(refer to)另外一种类型。
定义引用时,程序把引用和对象还有对象的初始值绑定在一起,因为引用无法重新绑定到另外一个对象,所以引用必须初始化。又因为引用不是一个对象,所以不能定义引用的引用。引用只能绑定在对象上。
指针(pointer)
指针的值形式:int nun=42; int *p=&nun;
指针为指针赋值:int *pd=p其中p为指针;
与引用不同,指针本身就是一个对象,允许赋值和拷贝,在它生命周期内可以先后指向多个不同的对象,指针无需在定义时赋值,如果在块区域内没有被初始化,也将拥有一个不确定的值。
void*指针
是一种特殊的指针类型,可以用于存放任意对象的地址
(四) const限定符
使用const限定符的变量值不会在被改变。
指向const对象的指针,表示指向常量的指针(pointer to const)
常量指针(const pointer).由于指针本身也是一个对象,故可以用const修饰指针,使指针本身成为一个常量。
如:int *const p=&i;
顶层const(top-level-const)
由于指针和所指的变量都是对象。用名词顶层const表示指针本身是一个常量。用名词底层const表示指针所指对象是一个常量。
常量表达式(const expression)
值不会改变,且在编译过程中就能得到计算结果的表达式。
const expression变量
将变量声明为constexpr类型,以便由编译器来验证变量值是否是一个常量表达式。
(五)处理类型
类型别名(type alias)是一个名字,它是某种类型的同义词。
传统方法是使用关键字typedef :typedef double wages; //wages是double的同义字
新标准方法使用别名声明(alias declaration) using Si=sale_item; //si是item的同义词。
auto类型说明符
使用auto让auto代替我们去分析表达式的类型。
decltype类型指示符
从表达式的类型推断出要定义的变量的类型,但是可以不用该表达式的值初始化。
(六)自定义数据结构
数据结构是把一组相关的数据元素组织起来然后用他们的策略和方法。
类体定义类的成员,我们类只有数据成员(data member).类的数据成员定义了类的对象的具体内容,每个对象有自己的一份数据成员的拷贝。