2.1 基本内置类型
(1)类型 usigned int 缩写为 usigned
(2)字符型分为 char 、 unsigned char 和 signed char
(3)当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。
取模:r = a - c * b,c = a / b (向负无穷方向舍入);求余,c向0方向舍入
例:
unsigned u1 = 42,u2 = 10;
std::cout << u2 - u1 << std::endl;
u2 - u1 = -32,则输出结果为对-32取模后的余数,如果int占32位,上述取模公式中,a = -32 , b = 232, c = -32 / 232 像负无穷方向摄入得c = -1,r = -32 + 232=4294967264。
(4)0开头的整数表示八进制,以0x或0X开头的代表十六进制,八进制和十六进制字面值的类型时能容纳其数量的int、unsigned int 、long、unsigned long、long long和unsigned long long 中的尺寸最小者,short没有对应的字面值。
(5)常见的转义序列
换行符:\n或\12 , 横向制表符:\t ,纵向制表符:\v ,
退格符:\b,双引号:\",单引号:\’,反斜线:**\**,
问号:\?,回车符:\r,进纸符:\f,报警符:\a或者\7,
空格:\40,空字符:\0,字符M:\x4d和\115。
2.2 变量
(1)列表初始化,若初始值存在丢失信息的风险,则编译器报错。
(2)定义于任何函数体外的变量被初始化为0,定义在函数体内部的内置类型变量将不被初始化。
(3)声明一个变量,在变量名前添加关键字extern,且不要显式初始化变量。
(4)定义负责创建与名字关联的实体,任何包含了显式初始化的声明即成为变量,extern语句如果包含初始值就不再是声明而是定义。
2.3 复合类型
(1)引用:将声明符写为&d的形式定义引用类型,不可直接引用字面值,引用必须被初始化,引用不是对象因此不能定义引用的引用。
(2)指针:指针本身就是对象,允许对指针赋值和拷贝,生命周期内可指向不同的对象,指针无需在定义时赋初值,不能定义指向引用的指针。
int ival = 1024;
//引用
int &refval = ival;
//指针
int *p = &ival;
(3)&用在表达式中为取地址符;*在表达式中为解引用符,由*p得到指针p所指的对象。
(4)void*可存放任意对象的地址,不能直接操作void*指针所指的对象,因为其类型不明确。
(5)**表示指向指针的指针,不能定义指向引用的指针。
int i = 42;
int *p;
int *&r = p;//r是一个指向指针p的引用
r = &i;//r相当于与指针p绑定,给r赋值意味着让指针p指向i
2.4 const限定符
(1)const常量对象一旦创建其值不可改变,因此必须初始化;只能在const类型的对象上执行不改变其内容的操作;如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。
(2)对常量的引用也必须是常量,允许常量引用绑定非常量的对象,字面值甚至表达式,不可通过常量引用改变绑定的非常量的值,但允许通过其他途径改变。
(3)指向常量的指针(const int *p = &…)不能用于改变其所指对象的值,但可以更改指针指向另外的对象;同时与常量引用相同,指向常量的指针可以指向一个非常量。
(4)常量指针(*放在const之前)必须初始化,意味着不变的是指针本身而不是指向的值,即它指向那个对象则一直指向这个对象,且如果对象类型允许则可以通过指针修改所指对象的值。
(5)顶层const规定本身不可改变,底层const规定自身所指对象不可改变,用于声明引用的const都是底层const。
(6)顶层const拷贝不受影响,但是底层const拷贝拷贝对象必须具有相同的底层const资格,一般非常量可以拷贝给常量,反之则不可以。
int i = 0;
int *const p1 = &i; //p1顶层const
const int c = 42; //c不可改变,顶层const
const int *p2 = &c;//允许改变p2的值,底层const
const int *const p3 = p2;//右边的const是顶层const,最左边的是底层const.
const int &r = c;//r用于引用底层const
i = c; //c是顶层const,拷贝不受影响
(7)常量表达式指值不会改变且在编译过程可得到计算结果的表达式,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。
(8)constexpr指针初始值必须为nullptr或者0,或存储在固定地址的对象(定义在函数体外的对象地址固定不变或有效范围超出函数本身的变量),可指向常量也可指向非常量。
(9)constexpr仅对指针有效,与指针所指对象无关。
constexpr int *q = nullptr;//q是一个指向整数的常量指针
constexpr int i = 42; //整型常量
constexpr const int *p = &i;//p是常量指针,指向整型常量
2.5 处理类型
(1)使用类型别名指代复合类型或常量,一定不可替换理解
typedef double wages;//类型别名关键字typedef
using SI = Sales_data; //别名声明using
typedef char *pstring;//pstring 是char*的别名
const pstring cstr = 0;//cstr是指向char的**常量指针**
//如果替换理解则为
const char *cstr = 0;//指向char常量的指针,与上述含义截然不同
(2)auto类型说明符,使编译器通过初始值推断变量的类型,auto一般忽略顶层const,保留底层const;但是auto引用仍会保留顶层const。
const int ci = i,&cr = ci;
auto b = cr://cr = ci,ci是顶层const忽略,b是一个整数
auto e = &ci;//对常量取地址是底层const,e是指向整型常量的指针
auto &g = ci;//引用顶层const保留,g是一个整型常量引用
(3)decltype类型指示符,返回变量类型(包括顶层const和引用)但不返回其值。
(4)如果表达式内容为解引用操作(*p)或者对变量加双括号((i)),则decltype得到引用类型。
2.6 自定义数据类型
(1) 类以关键字struct开始,紧跟类名和类体,类体花括号结束后加分号。
(2)头文件保护符,#define将名字设为预处理变量,#ifdef判断给定变量是否已经定义,#ifndef判断给定变量是否尚未定义,#endif结束上述两个指令。