### const用法详解 #### 一、概述 `const` 是 C++ 中一个非常重要的关键字,它用于声明常量或指定对象的某些属性为只读。相比于 C 语言中的 `#define` 宏定义,`const` 提供了更强大的功能和更好的类型安全性。本文将详细介绍 `const` 的各种用法及其带来的好处。 #### 二、基本用法 1. **声明只读变量** ```cpp const int i = 5; int j = 0; i = j; // 非法,导致编译错误 j = i; // 合法 ``` 在这段代码中,`i` 被声明为常量,意味着它的值一旦被赋予就不能被修改。因此,尝试将 `j` 的值赋给 `i` 会导致编译错误,而将 `i` 的值赋给 `j` 则是合法的。 2. **必须初始化** ```cpp const int i = 5; // 合法 const int j; // 非法,导致编译错误 ``` 当使用 `const` 关键字声明一个变量时,该变量必须在声明时初始化。这是因为 `const` 变量的值在其生命周期内不允许更改。 3. **跨文件引用** ```cpp extern const int i; // 合法 extern const int j = 10; // 非法,常量不可以被再次赋值 ``` 如果在其他文件中声明了一个 `const` 变量,则可以在当前文件中使用 `extern` 关键字来引用它。但是,如果尝试为这个外部引用赋值,则会引发编译错误。 #### 三、进阶用法 1. **类型检查** ```cpp #define I = 10 const long &i = 10; char h = I; // 没有错 char h = i; // 编译警告,可能由于数的截断带来错误赋值 ``` 使用 `const` 可以提高类型的可见性和安全性。与宏定义相比,`const` 更加明确地指出了变量的类型,这有助于编译器进行类型检查,减少因类型不匹配导致的潜在错误。 2. **避免不必要的内存分配** ```cpp #define STRING "abcdefghijklmn\n" const char string[] = "abcdefghijklm\n"; printf(STRING); // 为 STRING 分配了第一次内存 printf(string); // 为 string 一次分配了内存,以后不再分配 printf(STRING); // 为 STRING 分配了第二次内存 printf(string); ``` `const` 定义的字符串常量通常只会在程序中存在一份拷贝,而宏定义则可能多次分配内存。这对于大型项目来说,能够显著减少内存使用并提高性能。 3. **通过函数初始化** ```cpp int value() { return 100; } const int i = value(); ``` 可以通过函数调用来初始化 `const` 变量。这种方式不仅能够提供灵活性,还可以确保常量的值是在运行时计算出来的。 4. **修改 const 值的可能性** ```cpp const int i = 0; int *p = (int *)&i; *p = 100; ``` 虽然 `const` 变量的值理论上不能被修改,但通过类型转换可以绕过这一限制。这是一种不推荐的做法,因为它破坏了 `const` 的语义。 5. **数值常量与指针常量的区别** ```cpp const int i = 0; // i 是常量,i 的值不会被修改 const int *p1i = &i; // 指针 p1i 所指内容是常量 int *const p2i = ⅈ // 指针 p2i 是常量,所指内容可修改 const int *const p3i = &i; // 指针 p3i 是常量,所指内容也是常量 ``` - `const int i = 0;` 表示 `i` 是一个不可更改的整型常量。 - `const int *p1i = &i;` 表示 `p1i` 是指向整型常量的指针,但指针本身可以指向其他地方。 - `int *const p2i = ⅈ` 表示 `p2i` 是一个指向整型变量的常量指针,即指针本身不能改变所指向的位置,但可以通过指针修改所指向的数据。 - `const int *const p3i = &i;` 表示 `p3i` 是一个指向整型常量的常量指针,即指针本身不能改变所指向的位置,也不能通过指针修改所指向的数据。 #### 四、const 修饰类的数据成员 ```cpp class A { public: const int size; // 错误 int array[size]; // 错误,未知的 size }; // 正确方式 class A { public: enum { size1 = 100, size2 = 200 }; int array1[size1]; int array2[size2]; }; ``` - 类的 `const` 数据成员必须在构造函数的初始化列表中进行初始化。 - 如果需要定义整个类中都恒定的常量,应该使用枚举常量。 #### 五、小结 通过以上内容可以看出,`const` 的使用不仅仅限于简单地声明只读变量,还涉及到了类型安全、内存管理等多个方面。正确地使用 `const` 可以大大提高程序的质量和效率,是每个 C++ 程序员都应该掌握的重要技能之一。
剩余17页未读,继续阅读
- 粉丝: 1
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助