C++ Primer Fifth Edition notes(2)
- 1C++ Primer Fifth Edition notes(1)
- 2C++ Primer Fifth Edition notes(2)本文
- 3C++ Primer Fifth Edition notes(3)
- 4C++ Primer Fifth Edition notes(4)

2.1 基本内置类型
1 为什么不能把内置类型看作系统提前写好的类?
类型├── 内置类型:int、double、char、bool……└── 类类型:Sales_item、string、iostream 中的流类型……两者在语言规则中属于不同类别。
| 对比 | 内置类型 int | 类类型 Person |
|---|---|---|
是否由 class 定义 | 否 | 是 |
| 是否具有成员 | 否 | 可以有 |
| 能否调用成员函数 | 否 | 可以 |
| 基本运算由谁规定 | C++ 语言直接规定 | 类的定义决定 |
| 能否由程序员定义新的同类类型 | 不能定义新的内置类型 | 可以定义新类 |
内置类型是语言直接规定的类型,类类型是通过类定义产生的类型。
2 后缀与字面值
后缀(suffix) 是紧跟在整数或浮点数字面值后面的字母,用来影响字面值自身的类型。
| 字面值 | 类型含义 |
|---|---|
42 | 通常是 int |
42U | unsigned int |
42L | long |
42LL | long long |
42UL | unsigned long |
42ULL | unsigned long long |
后缀属于字面量的值本身,而非变量声明的一部分。
如果写成
long long value = 42,这里的42通常是int,随后隐式转换为long long。
3 浮点数字面值是什么类型?
浮点数字面值可以使用小数形式,或使用科学计数法。
如:
3.14159E0、1E3、2.5e-2,其中E或e表示以10为底的指数。3.14159E0 = 3.14159 × 10⁰ = 3.141591E3 = 1 × 10³ = 10002.5e-2 = 2.5 × 10⁻² = 0.025
| 字面值 | 类型含义 |
|---|---|
3.14F | float |
3.14 | double |
3.14L | long double |
没有后缀的浮点数字面值默认是double类型。
如:
float value = 3.14,初始化时需要把double转换为float,可能损失精度。
4 字符字面值与字符串字面值的区别是?
| 写法 | 种类 | 类型和内容 |
|---|---|---|
'A' | 字符字面值 | 一个 char |
"A" | 字符串字面值 | 'A' 和 '\0' 构成的常量字符数组 |
"" | 空字符串字面值 | 只包含 '\0' 的常量字符数组 |
常数字符数组也就是常数char数组。
编译器会在每个字符串字面值的末尾自动添加空字符'\0',用于标记字符串结束。
'\n'用于字符串换行。
5 什么是转义序列?
转义序列以反斜杠 \ 开头,用于表示不可打印字符或在语法中有特殊含义的字符。
| 含义 | 转义序列 |
|---|---|
| 换行(newline) | \n |
| 水平制表(horizontal tab) | \t |
| 响铃(alert) | \a |
| 垂直制表(vertical tab) | \v |
| 退格(backspace) | \b |
| 双引号 | \" |
| 反斜杠 | \\ |
| 问号 | \? |
| 单引号 | \' |
| 回车(carriage return) | \r |
| 换页(formfeed) | \f |
为什么反斜杠也需要转义?
如果要表示反斜杠字符本身,需要写两个反斜杠:
std::cout << "C:\\Users\\DESKTOP" << std::endl;在字符字面值和字符串字面值中,一个转义序列按一个字符处理。
6 八进制与十六进制转义序列
\ 后接一至三位八进制数字,\x 后接一位或多位十六进制数字。
数字表示字符的数值编码,一个转义序列按一个字符处理。
八进制转义序列:
| 转义序列 | 表示的字符 |
|---|---|
\7 | 响铃 |
\12 | 换行 |
\40 | 空格 |
\115 | 字符 M |
\0 | 空字符 |
例如:
std::cout << '\115' << '\n';输出:
M
十六进制转义序列:
例如:
std::cout << '\x4d' << '\n';输出:
M
7 前缀与字面值
前缀(suffix) 是紧跟在字符或字符串字面值前面的字母,用来影响字面值自身的类型。
| 前缀 | 字符示例 | 字符类型 | 字符串元素类型 |
|---|---|---|---|
| 无前缀 | 'a' | char | char |
L | L'a' | wchar_t | wchar_t |
u | u'a' | char16_t | char16_t |
U | U'a' | char32_t | char32_t |
u8 | 不用于字符 | — | char,采用 UTF-8 编码 |
前缀属于字面量的值本身,而非变量声明的一部分。
例如:
'a' // charL'a' // wchar_tu'a' // char16_tU'a' // char32_t"hello" // char 数组L"hello" // wchar_t 数组u"hello" // char16_t 数组U"hello" // char32_t 数组u8"hello" // UTF-8 字符串
8 布尔字面值是什么类型?
| 字面值 | 类型 | 含义 |
|---|---|---|
true | bool | 真 |
false | bool | 假 |
true 和 false 本身是 bool 类型,不需要进行类型转换。
如:
bool value = 1,字面值1是int类型,初始化时需要将int转换为bool,结果是true。
9 指针字面值是什么类型?
| 字面值 | 类别 | 含义 |
|---|---|---|
nullptr | 指针字面值 | 不指向任何对象 |
如:
int* pointer = nullptr,nullptr表示空指针,即该指针目前不指向任何对象。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













