3.5 const限定修饰符

节以魔法数字为引介绍了C++中的const限定修饰符的使用,主要分为两个部分:1、const修饰的变量;2、const修饰的指针

const修饰的变量

魔法数字(Magic Number) 是指在代码中直接使用的没有明确含义的常量数字,它们通常没有解释或说明,因此对代码的可读性、可维护性和可扩展性造成负面影响。例如,下列代码中的“3.14159”即为魔法数字。

double calculateArea(double radius) {
    return 3.14159 * radius * radius;  // 3.14159 是魔法数字
}

此外代码中需要使用到的一些人为设置的阈值,也属于魔法数字。例如,index<512代码中“512”意为当前设置的缓存区大小。
直接使用魔法数字降低了代码的可读性,也加大了代码的维护难度(比如阈值发生变动时,需要对多处进行手动修改)。
令魔法数字等于某个变量可以提高代码的可读性、降低代码的维护难度。但是存在变量可能被无意修改的问题
为此,可以使用“const”限定修饰符,令特定变量的值无法被修改。例如,上面两个例子可以改写为如下形式:

const double pi = 3.14159;
double calculateArea(double radius) {
    return pi * radius * radius;  // 3.14159 是魔法数字
}

const int bufSize = 512;
index < bufSize;

由于const修饰的变量在定义后无法改变值,因此const定义的变量在定义时必须赋初值

const修饰的指针

为了避免使用指针修改const修饰的变量的值,C++规定,必须使用const修饰的指针才能指向const修饰的变量。const在作用于指针时,根据修饰的位置有以下两种写法(这里只展示区别,不讨论语法对错):

// 写法一:const限定的是 *cpi
const int *cpi;

// 写法二:const限定的是 pci
int *const pci;

其中第一种限定*cpi使指针指向地址的值无法被修改,指针本身的指向则是可以修改的;第二种限定pci使指针指向的地址值无法被修改,指针指向地址的则是可以修改的,其中第二种写法需要在初始化时给出指针指向的地址
此外,还有一种写法,即将上两种写法进行结合,例如:

const int *const cpci;

此时,cpci指向的地址,及指向地址的值都无法被修改

const和#define在处理魔法数字时的区别

虽然const和#define都可以用于解决魔法数字问题,例如:

#define pi = 3.14159
#undef

const double pi = 3.14159

但是这两种方法在实现细节上存在如下差异:

  1. 类型安全:const定义的变量存在类型(如int、double、string等),#define定义的变量则不存在类型。
  2. 作用区域:#define定义的变量可以全局使用,直到使用#undef取消,const定义的变量则遵循代码的作用域(比如在函数块内定义的变量只能在函数块内使用)
  3. 实现方式:#define是通过在代码编译前进行文本替换,const修饰的变量可以在代码编译过程中进行优化。
  4. 调试:调试时const定义的变量能够看到名称和值;#define定义的变量仅可看到替换后的值

课后习题:

解释下列定义的意思,并指出、改正其中的非法定义

(a) int i;
(b) const int ci;
(c) const int *cpi;
(d) int *const pci;
(e) const int *const cpci;

(a) 正确,定义了一个int型变量i,可以不赋初值;
(b) 错误,定义了一个const修饰的int型变量ci,需要赋初值;
(c) 正确,定义了一个const修饰的int类型指针*cpi,其指向地址的值不可以修改,但是指向地址可以修改,因此可以不赋初值;
(d) 错误,定义了一个const修饰的int类型指针pci,其指向地址不可修改,因此必须赋初值。
(e) 错误,定义了一个const修饰的int类型指针,其指向地址及指向地址的值都不能修改,因此必须赋初值

你可能感兴趣的:(C++,Primer,C++学习,开发语言,C++)