目录
C++ Primer Plus Notes
知识点来自《C++ Primer Plus(第6版)中文版》。
并非所有条目都有用,仅供查漏补缺。条目后小号数字为原文在原书中的页码。
第1章 预备知识
1.1.C++简介
- OOP 强调的是编程的数据方面,而泛型编程强调的是独立于特定数据类型。3
第2章 开始学习 C++
2.1.进入 C++
- C++对大小写敏感。11
- 类、函数和变量是 C++ 编译器的标准组件,被放置在命名空间 std 中。15
- endl 确保程序继续运行前刷新输出,而“\n”不能。17
2.2.C++ 语句
- C/C++可以连续使用赋值运算符(=)。20
- 在打印之前,cout 必须将整数形式的数字转换为字符串形式。20
2.3.其他 C++ 语句
- 要对特定对象执行允许的操作,需要给对象发送一条消息。C++提供了两种发送消息的方式:类方法(本质上是函数调用)、重新定义运算符。22
2.4.函数
- 在使用函数前,C++编译器必须知道函数的参数类型和放回值类型。C++提供这种信息的方式是使用函数原型语句。24
- 库文件中包含了函数的编译代码,而头文件中则包含了原型。24
- main 不是关键字。27
第3章 处理数据
- 内置的 C++类型分两组:基本类型和复合类型。32
3.1.简单变量
-
对类型名使用 sizeof 运算符时,应将名称放在括号中,但对变量名使用该运算符,括号是可选的。36
-
C++另一种 C 语言没有的初始化语法:
int wrens(432);
还有另一种初始化方式,这种方式用于数组和结构,但在 C++98 中,也可用于单值变量:
int hamburgers = {24};
将大括号初始化器用于单值变量的情形还不多,但 C++11 标准使得这种情形更多了。首先,采用这种方式时,可以使用等号,也可以不使用。其次,大括号内可以不包含任何东西,在这种情况下,变量将被初始化为零。最后,这有助于更好地防范类型转换错误:
int emus{7}; int rheas = {12}; int rocs = {}; int psychics{};
37
-
C++确保了无符号整型在上溢和下溢时会循环取值,但并不保证符号整型发生上溢和下溢时不出错。38
-
自然长度指的是计算机处理起来效率最高的长度。如果没有非常说服力的理由来选择其他类型,则应使用 int。38
-
通常,仅当有大型整数数组时,才有必要使用 short。38
-
C++使用前一(两)位来标识数字常量基数。如果第一位为 1~9,则基数为 10;如果第一位是 0,第二位为 1~7,则基数为 8;如果前两位为 0x 或 0X,则基数为 16。39
-
iostream 提供控制符 dec、hex 和 oct 分别用于指示 cout 以十进制、十六进制和八进制格式显示整数。
#include <iostream> using namespace std; int main() { int chest = 42; int waist = 42; int inseam = 42; cout << "Monsieur cuts a striking figure!" << endl; cout << "chest = " << chest << " (decimal for 42)" << endl; cout << hex; cout << "waist = " << waist << " (hexadecimal for 42)" << endl; cout << oct; cout << "inseam = " << inseam << " (octal for 42)" << endl; return 0; }
Monsieur cuts a striking figure! chest = 42 (decimal for 42) waist = 2a (hexadecimal for 42) inseam = 52 (octal for 42)
40
-
程序的声明将特定的整型变量的类型告诉了 C++编译器,除非有理由存储为其他类型(如使用了特殊的后缀来表示特定的类型,或者值太大,不能存储为 int),否则 C++将整型常量存储为 int 类型。
对于后缀:添加特定后缀会以相应的类型来存储。
对于长度:对于十进制整数,使用下面几种类型中能存储该数的最小类型来表示:int、long 或 long long;对于不带后缀的十六进制或八进制整数使用下面几种类型中能存储该数的最小类型来表示:int、unsigned int、long、unsigned long、long long 或 unsigned long long。
40
-
C++实现使用的是主机编码。41
-
与 int 不同的是,char 在默认情况下既不是没有符号,也不是有符号。是否有符号由 C++实现决定。如果 char 有某种特定的行为对您来说特别重要,则可以显式地将类型设置为 signed char 或 unsigned char。45
-
// TODO 17/12/2022 meyok:理解 wchar_t,第 45 页。
-
// TODO 17/12/2022 meyok:理解 char16_t 和 char32_t,第 45 页。
3.2.const 限定符
-
const 与 #define 相比,有以下优点:
- 能够明确指定类型。
- 可以使用 C++的作用域规则将定义限制在特定的函数或文件中。
- 可以将 const 用于更复杂的类型。
46
-
C 与 C++中 const 的主要区别:
- 作用域规则。// TODO 17/12/2022 meyok
- 在 C++中可以使用 const 值来声明数组长度。
47
3.3.浮点数
- C 和 C++对于有效位数的要求是,float 至少 32 位,double 至少 48 位,且不少于 float,long double 至少和 double 一样多。通常,float 为 32 位,double 为 64 位,long double 为 80、96 或128 位。48
- 在默认情况下,像 8.24 和 2.4E8 这样的浮点常量都属于 double 类型。如果希望常量为 float 类型,请使用 f 或 F 后缀。对于 long double 类型,可使用 l 或 L 后缀。49
3.4.C++运算符
-
对于运算的符号问题,满足如下规则:
(a/b)*b + a%b = a
。50 -
将浮点数转化为整型时,C++采取截取而不是四舍五入。54
-
C++11 使用的列表初始化不允许缩窄。54
-
对于表达式中的类型转换:
自动转换:在计算表达式时,可能会有整型提升,以提升运算速度。
运算时出现浮点数,转换为有效位更大的类型,否则都为整数做整型提升。
整型级别:对于有符号整数从高到低为 long long、long、int、short、signed char。无符号整型与其相同。char、unsigned char 和 signed char 级别相同。bool 级别最低。wchat_t、char16_t、char32_t 的级别与其底层类型相同。
54-55
-
强制类型转换不会改变变量本身,而是创建一个新的、指定类型的值。55
-
C++强制类型转换推荐写法:
typeName (value)
目的要让强制类型转换就像是函数调用。
55