C++ Primer

C++ Primer (5ed)

基于C++11标准

备注: c++11标准虽然不是最新的, 但是后续的重要基础, c++14对c++11做了少数修补, c++17与c++20不清楚改动多大. 由于此书交叉引用过多, 所以计划先初步做笔记, 多看几遍后再补充完整。目录完全照搬原书,但所记内容不一定。

第 1 章

main函数的返回值必须为int

第 2 章: 变量与基本数据类型 (Variables and Basic Types)

2.1 原生内置类型 (Primitive Build-in Types)

bool/char/wchar_t/char16_t/char32_t/short/int/long/long long/float/double/long double/void

  • 数值类型分为两类, 一类是整数类型 (包括 bool 与 char 在内 ), 另一类是浮点型.

  • 注意C++标准没有规定 char 类型是指 unsigned char 还是 signed char

  • 一般情况下, 整数类型默认为signed (char是个例外).

  • C++标准规定有符号整数正负区间应大致平分, 但并未规定其存储形式. 以 signed char 为例, C++标准规定其至少要包含 [-127, 127] 这些整数, 但一般而言, 大多数机器都使用补码形式存储整数, 所以一般取值范围一般为 [-128, 127]

关于类型使用的一些建议(略)

类型转换

待确认: 整数混合计算时, 按如下方式进行转换 (以最大容量为准), 例子: 32 位无符号整数认为具有 32 位, 32 位有符号整数认为具有 31 位, 操作数先统一转为较大者再计算

(Literals) 字面量:

整数/浮点数/字符/字符串/布尔/指针(void). 注意"abc"的类型是const char[]

2.2 变量 (Variables)

变量初始化写法

以下写法均可

声明与定义

命名规则与命名规范

C++ Primer 5ed 2.2.3 Identifies

The standard also reserves a set of names for use in the standard library. The identifiers we define in our own programs may not contain two consecutive underscores, nor can an identifier begin with an underscore followed immediately by an uppercase letter. In addition, identifiers defined outside a function may not begin with an underscore.

C++ Primer中提及到表示符中不要出现连续的两个下划线, 或者以下划线加大写字母开头, 函数外定义的变量不要以下化线开头, 但实际测试时并不会有报错信息

备注: C++中可以使用and, or

2.3 复合类型 (Compound Types)

复合类型: 引用与指针

a declaration is a base type followed by a list of declarators

例如: int i = 0; &a = i; *p = &i, base typeint, 后面的都叫declarators, 引用不是一个变量, 但指针是一个变量. 指针的值可以是: 一个对象的地址; 一个对象的下一个地址; 空指针字面量(nullptr); 无效地址

2.4 常量限定符 (const Qualifier)

const 修饰的变量不能被重新赋值,声明时必须初始化。

const 与 extern

在默认情况下,const 限定的标识符只在本文件中有效,即假设 a.cpp 中与 b.cpp 中同时用 const int i = 1; 进行了定义,gcc a.cpp b.cpp -o out 命令编译时不会报错。但假如没有用 const 限定,则会出现重定义的错误。

备注:extern 关键字的作用是声明标识符有全局作用域

为了使得一个常量被多个文件使用,建议按如下方式:

top-level const 与 low-level const

top-level const指变量本身不可变, low-level const指与之相关的变量不可变, top-level const变量可以用非const变量赋值, 但low-level const属性必须一致

constexpr 关键字

const expression (常量表达式) 表示可以在编译期被计算出来, 字面量是一个常量表达式, 一个用常量表达式初始化的 const 对象是一个常量表达式. constexpr关键词被用来提示编译器检查后面的内容必须是常量表达式, 确保其在编译过程中可以计算并计算出来.

decltype关键字

2.5 类型处理 (Dealing with Types)

2.6 自定义数据结构 (Defining Our Own Data Structures)

第 6 章: 函数 (Functions)

6.7 函数指针 (Pointer to Functions)

函数指针准确理解应该是: 指向函数类型的指针

涉及到函数指针, 类型会变得很复杂且费解, 下面的示例里主要注意这几点:

  • function type 与 pointer to function type 有时候会发生自动转换, 但它们是不同的东西 (C++ Primer Plus 一书中指出了这个自动转换为什么合法的原因只是两种学说有矛盾, 因此 C++ 规定自动转换是合法的)

  • using, decltype 在这里的使用, 通常能简化很多复杂的符号

疑问: 一个具体的返回参数是函数的例子

Last updated

Was this helpful?