C++常量
【C++学习】以w3cschool的教程为框架,记录总结C++Primer第五版的学习内容。
常量
-
常量是固定值,在程序执行期间不会改变,这些固定的值又叫做字面值;
-
常量可以是任何的基本数据类型,可分为整型和浮点型字面值、字符和字符串字面值、转义序列、布尔字面值和指针字面值;
整型和浮点型字面值
-
整型字面值可以是十进制、八进制或十六进制的常量,0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
-
浮点字面值由整数部分、小数点、小数部分和指数部分组成,可以使用小数形式或者指数形式来表示浮点常量。
字符和字符串字面值
- 由单引号
''
括起来的一个字符称为char型字面值,双引号" "
括起来的零个或多个字符则构成字符串型字面值; - 字符串字面值的类型实际上是由常量字符构成的数组:
- 编译器在每个字符串的结尾处添加一个空字符
'\0'
,因此字符串字面值的实际长度要比它的内容多1; - 一个字符串可包含char型字面值、转义序列等。
- 编译器在每个字符串的结尾处添加一个空字符
转义序列
转义序列 | 含义 |
---|---|
\ | \ 字符 |
’ | ’ 字符 |
" | " 字符 |
? | ? 字符 |
\b | 退格键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车 |
布尔字面值和指针字面值
- true和false是布尔类型的字面值;
- nullptr是指针字面值。
const限定符
-
可以使用 const 对变量的类型加以限定:
const type variable = value;
- 由于const对象一旦创建后其值就不能再改变,所以const对象必须初始化,且初始值可以是任意复杂的表达式。
- 默认状态下,const对象仅在文件内有效,如果想在文件间共享const对象,必须在变量的定义前添加extern关键字。
-
const的引用
-
可以把引用绑定到const对象上,称之为对常量的引用(reference to const);
-
非常量引用不能绑定到常量对象上;
const int ci = 1024; const int &r1 = ci; int &r2 = ci; //错误
-
在初始化常量引用时允许用任意表达式作为初始值,只要该表达式能转换成引用的类型即可;
-
允许为一个常量引用绑定非常量的对象、字面值、甚至是一般表达式。
-
-
指向常量的指针
-
要想存放常量对象的地址,只能使用指向常量的指针(pointer to const);
const double pi = 3.14159; const double *cptr = π
-
指向常量的指针不能用于改变其所指对象的值,但该对象是否能改变依赖于所指对象的类型;
-
允许令一个指向常量的指针指向一个非常量对象;
-
-
const指针
-
允许把指针本身定为常量,常量指针(const pointer)必须初始化;
-
*const
说明指针是一个常量;const double pi = 3.14159; const double *const pip = π
-
指针本身是一个常量并不意味着不能通过指针修改其所指对象的值,能否这样做依赖于所指对象的类型。
-
-
顶层const和底层const
- 顶层const表示对象本身是const,底层const表示指针所指的对象是const;
- 对一般对象,只有顶层const;
- 对指针这种,本身是一个对象,又指向一个对象,故用顶层const表示指针是const,用底层const表示存放的地址为const(即指向的对象为const);
- 对声明引用的const,都是底层const,因为引用本身不是对象,故不可能有顶层const。
-
常量表达式
- 指值不会改变并且在编译过程中就能得到计算结果的表达式,用常量表达式初始化的const对象也是常量表达式,字面值常量属于常量表达式;
- 一个对象(或表达式)是不是常量表达式由他的数据类型和初始值共同决定。
-
constexpr变量
-
声明为constexpr的变量一定是一个常量,并且必须用常量表达式初始化;
-
限定符constexpr仅对指针有效,与指针所指的对象无关:
const int *p = nullptr;//p是一个指向整型常量的指针 cosntexpr int *q = nullptr;//q是一个指向整数的常量指针
-