<c++> const 常量限定符

简介: <c++> const 常量限定符

什么是 const 常量限定符


Q:什么是 const 常量限定符?


A:const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。


const 的初始化


const用来修饰变量的值时,变量的值不可改变。举个例子,一天有24个小时,不会变成别的数字,我们就可以在程序中这样定义时间。


const int hour = 24;    //24小时


这样操作以后,hour就变成了一个常量,任何试图对hour的赋值操作都是错误的。


hour = 10;          //错误


因为const类型一旦创建它的值就无法进行更改,所以const对象必须进行初始化。


const int i = get_line();  //正确
  const int j = 1;      //正确
  const int k;        //错误


const 的默认作用域


const修饰的常变量,默认仅在本文件内有效。

按照上面的例子来讲,编译器在编译时会默认将hour用24进行替换。要做到这一点,在编译时编译器需要知道常变量的初始值。当程序源文件很多时,在每一文件中都需要访问到常变量的初始值,为了做到这一点,每一个源文件中都需要有对常变量的定义,但是这样会导致对一个变量的重复定义。为了解决这个矛盾,我们约定常变量的默认作用域仅限于本文件,这相当于在不同的文件中定义了多个独立的同名变量。

如果想在多个文件中使用同一个常变量,可以通过在常变量前面添加extern关键字来解决,这样常变量就只用定义一次就可以了。


extern const int hour = 24;    //24小时


const 的引用


Q:什么是对常量的引用?


A:可以把引用绑定到const对象上,就像绑定到其他对象上一样,这就是对常量的引用。与普通引用不同的是,对常量的引用不能被用于修改它所绑定的对象。


const int ci = 1024;
const int &r1 = ci;   // 正确
r1 = 42;      // 错误
int &r2 = ci;      // 错误


因为r1是对常量的引用,不能赋值,所以不正确。

因为r2是一个非常量引用指向一个常量对象,所以不正确。


例外情况


上面我们讲了引用的类型必须和所引用的对象的类型一致,但是有两个例外。


其中一种例外情况是:初始化常量引用时,允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式。

第二种例外情况是:对const的引用可能引用一个并非const的对象。常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定。因为对象也可能是个非常量,所以允许通过其他途径改变它的值。


const 与指针


const指针必须初始化,一旦初始化完成,则它的值就不能再改变了。


const指针的声明


在声明指针时,可以在类型的前或者后或者前后使用关键字 conat,他们的含义都不同。


const int *p1   // 指向整形常量的指针,它指向的值不能修改。
  int * const p2    // 指向整形的常量指针,它不能再指向别的变量,但指向(变量)的值可以修改。
  const int * const p3  // 指向整形常量的常量指针。它既不能再指向别的常量,指向的值也不能修改。


指向 const 的指针


首先指向整形常量的指针是一个指针,这个指针是指向一个const 类型的指针。


const int *p1   // 指向整形常量的指针,它指向的值不能修改。
  int const * p2    // 指向整形的常量指针,它指向的值不能修改。


这种的特点是地址可以随便指,但是地址里面保存的值却是不能改变。


const指针


首先const指针是一个指针,这个指针是const类型的,也就是这个指针变量的地址不能变,一直指向这个地址,地址所被保存的内容是可变的。


int * const p2    // 指向整形的常量指针,它不能再指向别的变量,但指向(变量)的值可以修改。


指向 const 的 const指针


const int * const p3  // 指向整形常量的常量指针。它既不能再指向别的常量,指向的值也不能修改。


指针前面有const进行修饰,这个指针p3就是一个指针常量,所以指针的地址就被固定了,只能进行初始化。 而对于 *p3 而言,前面又有const进行修饰,所以*p 就是一个常量了,也就是p指向地址,地址上保存的数据是一个常量,不能被改变的。


相关文章
|
3月前
|
C++
C++中的const指针与const引用
C++中的const指针与const引用
45 2
|
2月前
|
安全 数据库连接 C++
C++一分钟之-C++中的常量与宏定义
【6月更文挑战第18天】**C++编程中,常量(`const`和`constexpr`)确保值不变,用于配置、计算和逻辑控制。宏定义是预处理阶段的文本替换,适用于条件编译和简化代码。注意`const`的正确使用,避免过度的`const_cast`。宏可能导致命名冲突、副作用和类型安全问题,应谨慎使用。优选类型安全的常量定义,以提升代码质量和可维护性。**
34 5
|
1月前
|
C++
【C++】string类的使用④(常量成员Member constants)
C++ `std::string` 的 `find_first_of`, `find_last_of`, `find_first_not_of`, `find_last_not_of` 函数分别用于从不同方向查找目标字符或子串。它们都返回匹配位置,未找到则返回 `npos`。`substr` 用于提取子字符串,`compare` 则提供更灵活的字符串比较。`npos` 是一个表示最大值的常量,用于标记未找到匹配的情况。示例代码展示了这些函数的实际应用,如替换元音、分割路径、查找非字母字符等。
|
2月前
|
编译器 C++
【C++】类和对象④(类的默认成员函数:取地址及const取地址重载 )
本文探讨了C++中类的成员函数,特别是取地址及const取地址操作符重载,通常无需重载,但展示了如何自定义以适应特定需求。接着讨论了构造函数的重要性,尤其是使用初始化列表来高效地初始化类的成员,包括对象成员、引用和const成员。初始化列表确保在对象创建时正确赋值,并遵循特定的执行顺序。
|
2月前
|
C++
C++之变量与常量
C++之变量与常量
19 0
|
2月前
|
编译器 C++
【C++】:const成员,取地址及const取地址操作符重载
【C++】:const成员,取地址及const取地址操作符重载
20 0
|
3月前
|
编译器 C++
C++中的内联函数与const限定词的使用
C++中的内联函数与const限定词的使用
21 1
|
3月前
|
编译器 C语言 C++
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)(下)
从C语言到C++⑤(第二章_类和对象_中篇)(6个默认成员函数+运算符重载+const成员)
16 1
|
2月前
|
存储 安全 编译器
C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)
C++进阶之路:探索访问限定符、封装与this指针的奥秘(类与对象_上篇)
20 0
|
3月前
|
程序员 编译器 C++
c++常量
c++常量
23 0