第五章总结
本节阅读量:章节回顾
常量是在程序执行期间不能更改的值。C++支持两种类型的常量:命名常量和字面值常量。
命名常量是与标识符关联的常量值。常变量是一种命名常量,具有替换文本的类对象宏也一样。
字面值常量是与标识符无关的常量值。
值不能更改的变量称为常变量。const关键字可用于使变量成为常量。必须初始化常变量。通过值传递或通过值返回时避免使用const。
类型限定符是用于修改类型行为方式的关键字。从C++23开始,C++仅支持const和volatile作为类型限定符。
常量表达式是可以在编译时计算的表达式。必须在运行时计算的表达式有时称为运行时表达式。
编译时常量,其值在编译时已知。运行时常量是一个常量,其初始化值直到运行时才知道。
constexpr变量必须是编译时常量,并用常量表达式初始化。函数参数不能是constexpr。
字面值是直接插入到代码中的值。字面值具有类型,字面值后缀可以用于从默认类型更改成对应的类型。
魔数是字面意思不清楚或以后可能需要更改的字面值(通常是数字)。不要在代码中使用魔数。相反,请使用符号常量。
在日常生活中,我们用十进制数计数,十进制数使用0到9这10个数字。计算机使用二进制,只使用0和1这2个数字。C++还支持八进制(以8为基数)和十六进制(以16为基数)。
条件运算符( ? : )(有时也称为算术if运算符)是三元运算符(接受3个操作数的运算符)。给定形式为 条件表达式c ? x : y,如果条件c的计算结果为true,则将计算x,否则将计算y。条件运算符通常需要用括号括起来:
- 如果条件运算符作为子表达式,用圆括号括住整个条件运算符。
- 为了可读性,条件运算符如果条件表达式中包含任何运算符(函数调用运算符除外),请用括号括起来。
函数内联展开,函数调用会在对应的位置被函数体中的代码替换。使用inline关键字声明的函数称为inline函数。
内联函数和变量有两个主要要求:
- 编译器需要能够在使用函数的每个转换单元中看到内联函数或变量的完整定义(前向声明并不足够)。
- 内联函数或变量的每个定义都必须相同,否则将导致未定义的行为。
在现代C++中,术语inline已经演变为“允许多个定义”。因此,内联函数是允许在多个文件中定义的函数。C++17引入了内联变量,这些变量允许在多个文件中定义。
内联函数和变量对于仅含头文件的库特别有用。
constexpr函数是一个函数,其返回值可以在编译时计算。要使函数成为constexpr函数,只需在返回类型之前使用constexpr关键字。constexpr函数仅在需要常量表达式的上下文中使用时才保证在编译时求值。否则,它们可以在编译时(如果符合条件)或运行时进行计算。
consteval函数是必须在编译时计算的函数。
constexpr函数和consteval函数隐式内联。
字符串是用于表示文本(如名称、单词和句子)的连续字符的集合。字符串字面值总是放在双引号之间。C++中的字符串字面值是C样式的字符串,它的类型很奇怪,很难使用。
string提供了一种简单、安全的处理文本字符串的方法。std::string位于头文件中。string的初始化和复制开销很大。
string_view提供对现有字符串(C样式字符串文本、std::string或char数组)的只读访问,而不进行复制。查看已销毁的字符串的std::string_view有时称为悬空视图。当修改std::string时,该std::string的所有视图都将无效。使用无效的视图将产生未定义的行为。
C样式的字符串字面值在整个程序运行过程中有效,因此可以将std::string_view赋值为C样式的字符串字面值,甚至可以从函数中返回这样的std::string_view。
子字符串是现有字符串中的连续字符序列。
