共计 4154 个字符,预计需要花费 11 分钟才能阅读完成。
变量和基本类型
基本内置类型
算数类型: 包括整型和浮点型
C++ 算术类型
类型 含义 最小尺寸
bool 布尔类型 未定义
char 字符 8 位
wchar_t 宽字符 16 位
char16_t Unicode 字符 16 位
char32_t Unicode 字符 32 位
short 短整型 16 位
int 整型 16 位
long 长整型 32 位
long long 长整型 64 位
float 单精度浮点数 6 位有效数字
double 双精度浮点数 10 位有效数字
long double 扩展精度浮点数 10 位有效数字
其他字符类型用于扩展字符集,char 在一些机器上是有符号的,在另一些机器上又是无符号的
带符号类型和无符号类型
带符号:signed
无符号:unsigned
类型转换
1、将一个非布尔类型的算术值赋给布尔类型时,初始值为 0 则结果为 false,否则结果为 true
2、将一个布尔值赋给非布尔类型时,初始值为 false,则结果为 0,初始值为 true,则结果为 1
3、将一个浮点数赋给整数类型时,结果值将仅保留浮点数中小数点之前的部分
4、将一个整数值赋给浮点类型时,小数部分记为 0,若该整数所占空间超过浮点类型容量,精度会有损失
5、赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
6、赋给带符号类型一个超出它表示范围的值时,结果是未定义的
字面值常量
整型和浮点型字面值
整型字面值:十进制数、八进制数(以 0 开头的整数)、十六进制数(以 0x 或 0X 开头的整数)浮点型字面值:以一个小数或以科学计数法表示的指数,其中指数部分用 E 或 e 标识
字符和字符串字面值
字符串字面值实际上是由常量字符构成的数组,编译器在每个字符串结尾处添加一个空字符(‘\0’)
转义序列
有两类字符不可直接使用,一类是不可打印字符,没有可视的图符;另一类是具有特殊含义的字符,需要用到转义序列,以 '\' 作为开始
常见转义序列
换行符 \n 横向制表符 \t 报警(响铃)符 \a
纵向制表符 \v 退格符 \b 双引号 \"反斜线 \\ 问号 \? 单引号 \'
回车符 \r 进纸符 \f
也可使用泛化的转义序列,形式为:x 后紧跟 1 个或多个十六进制数字,或者后紧跟 1 个、2 个或 3 个八进制数字,数字部分表示的是字符对应的数值,若后面跟着的八进制数字超过 3 个,只有前 3 个数字与构成转义序列
指定字面值的类型
前缀 含义 类型
u Unicode 16 字符 char16_t
U Unicode 32 字符 char32_t
L 宽字符 wchar_t
u8 UTF-8(仅用于字符串字面常量)char
整型字面值 浮点型字面值
后缀 最小匹配类型 后缀 类型
u or U unsigned f 或 F float
l or L long l 或 L long double
ll or LL long long
布尔字面值:true 和 false
指针字面值:nullptr
变量
变量定义的基本形式:
类型说明符 一个或多个变量名组成的列表,变量名以逗号分隔,最后以分号结束
初始化:
创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替
声明:
使名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明,在变量名前添加关键字 extern
定义:
负责创建与名字关联的实体,任何包含了显示初始化的声明即成为定义
标识符
由字母、数字和下划线组成,必须以字母或下划线开头,长度没有限制,对大小写敏感
C++ 关键字
alignas continue friend register true
alignof decltype goto reinterpret_cast try
asm default if return typedef
auto delete inline short typeid
bool do int signed typename
break double long sizeof union
case dynamic_cast mutable static unsigned
catch else namespace static_assert using
char enum new static_cast virtual
char16_t explicit noexcept struct void
char32_t export nullptr switch volatile
class extern operator template wchar_t
const false private this while
const_cast for public throw
复合类型
基于其他类型定义的类型
引用
为对象起了另一个名字,引用类型引用另外一种类型,通过将声明符写成 &d 的形式来定义引用类型,d 是声明的变量名,引用必须初始化,引用并非对象,所有引用的类型都要和与之绑定的对象严格匹配,引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑在一起
指针
1、指针本身就是一个对象,允许对指针赋值和拷贝,在指针的生命周期内可以先后指向几个不同的对象
2、指针无需在定义时赋初始值
3、指针存放某个对象的地址,要想获取该地址,需要使用取地址符(操作符 &)4、指针值:(1) 指向一个对象
(2) 指向紧邻对象所占空间的下一个位置
(3) 空指针,意味着指针没有指向任何对象
(4) 无效指针,也就是上述情况之外的其他值
5、如果指针指向了一个对象,则允许使用解引用符(操作符 *)来访问该对象
6、空指针:不指向任何对象,得到空指针最直接的办法就是用字面值 nullptr 来初始化指针,nullptr 是一种特殊类型的字面值,可以被转换成任意其他的指针类型
7、C++11 之前使用 NULL 的预处理变量来给指针赋值,变量在头文件 cstdlib 中定义,值就是 0,由预处理器负责管理
8、类型相同的合法指针可用 == 操作符和!= 操作符来进行比较
9、void* 指针用于存放任意对象的地址,可用来和别的指针比较、作为函数的输入或输出,或者赋值给另一个 void* 指针,但不能直接操作 void* 指针所指向的对象
指向指针的指针
通过 * 的个数可以区分指针的级别,** 表示指向指针的指针,*** 表示指向指针的指针的指针
指向指针的引用
int i = 42;
int *p = &i;
int *&r = p;
从右向左读 r 的定义,&r 表示 r 是一个引用,int * 表示 r 所引用的对象的类型是指向 int 类型的指针
const 限定符
1、const 对象一旦创建后其值就无法再改变,因此 const 对象必须初始化
2、默认状态下,const 对象仅在文件内有效
3、如果想在多个文件之间共享 const 对象,必须在变量的定义之前添加 extern 关键字
const 引用
对常量的引用
const int ci = 1024;
const int &r1 = ci; // 正确:引用及其对应的对象都是常量
r1 = 412; // 错误:r1 是对常量的引用
int &r2 = ci; // 错误:试图让一个非常量引用指向一个常量对象
对 const 的引用可能引用一个并非 const 的对象
指针和 const
const double pi = 3.14; //pi 是个常量,他的值不能改变
double *ptr = π // 错误:ptr 是一个普通指针
const double *cptr = π // 正确:cptr 可以指向一个双精度常量
*cptr = 42; // 错误:不能给 *cptr 赋值
const 指针
常量指针:将 * 放在 const 之前,必须初始化,初始化后不能再指向其他对象
int errNumb = 0;
int *const curErr = &errNumb; //curErr 将一直指向 errNumb
const double pi = 3.14159;
const double *const pip = π //pip 是一个指向常量对象的常量指针
顶层 const
顶层 const 表明指针本身是个常量,底层 const 表明指针所指的对象是一个常量
int i = 0;
int *const p1 = &i; // 不能改变 p1 的值,这是一个顶层 const
const int ci = 42; // 不能改变 ci 的值,这是一个顶层 const
const int *p2 = &ci; // 允许改变 p2 的值,这是一个底层 const
const int *const p3 = p2; // 靠右的 const 是顶层 const,靠左的是底层 const
const int &r = ci; // 用于生命引用的 const 都是底层 const
constexpr 和常量表达式
常量表达式:不会改变并且在编译过程就能得到计算结果的表达式
一个对象(或表达式)是不是常量表达式由他的数据类型和初始值共同决定
在 C ++11 中,允许将变量声明为 constexpr 类型以便由编译器来验证变量的值是否是一个常量表达式,声明为 constexpr 的变量一定是一个常量,而且必须用常量表达式来初始化
指针和 constexpr
constexpr 仅对指针有效,与指针所指的对象无关
类型别名
传统方法使用关键字 typedef
typedef double wages; //wages 是 double 的同义词
使用别名声明定义类型的别名:using SI = Sales_item; //SI 是 Sales_item 的同义词
typedef char *pstring;
const pstring cstr ≠ const char *cstr
声明语句中用到 pstring 时,基本数据类型是指针,用 char* 重写了声明语句后,数据类型就变成了 char,* 成为了声明符的一部分
auto 类型说明符
auto 让编译器通过初始值来推算变量的类型,auto 定义的变量必须有初始值
auto 一般会忽略掉顶层 const,同时底层 const 则会保留下来
decltype 类型指示符
选择并返回操作数的数据类型,编译器分析表达式并得到它的类型,却不实际计算表达式的值
decltype(f()) sum = x; // sum 的类型就是函数 f 的返回类型
如果 decltype 使用的表达式不是一个变量,则 decltype 返回表达式结果对应的类型
如果表达式的内容是解引用操作,则 decltype 将得到引用类型
对于 decltype 所用的表达式来说,如果变量名加上了一对括号,则得到的结果与不加括号时会有所不同,如果不加,则得到的结果就是该变量的类型,如果添加了一层或多层括号,编译器就会把它当成一个表达式
decltype((variable)) 的结果永远是引用,而 decltype(variable) 结果只有当 variable 本身就是一个引用时才是引用
正文完