【C/C++】const 的可变与不可变

329 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。

const 的作用

  • 修饰变量,将变量(局部变量或全局变量)定义为常量
  • 修饰函数的参数,表示在函数体内不能修改这个参数的值
  • 修饰函数的返回值
    • 返回值的类型为指针:那么函数返回值的内容不能被修改,而且这个返回值只能赋给被const修饰的指针
    • 返回值为引用:那么这个函数调用表达式不能被作为左值使用
    • 返回值是普通值:由于这个返回值是一个临时变量,在函数调用结束后这个临时变量的生命周期也就结束了,因此把这些返回值修饰为const是没有意义的
  • C++中,修饰类的数据成员,表示这个数据成员只在某个对象生存期内是常量,而对于整个类而言,是可变的
  • C++中,修饰类的成员函数,表示这个函数不能修改对象的成员变量

const 的优点

  • 保护被修饰的内容,防止被意外修改,增强了程序的健壮性
  • 避免意义模糊的数字出现,方便进行参数的调整和修改。同宏定义一样,可以做到一变都变
  • 使编译器对处理内容有更多的了解,消除了一些隐患,如会知道某个常量不允许被修改
  • 为函数重载提供参考,只有const对象才调用const方法;非const对象调用非const方法
  • const定义的常量在程序运行过程中只有一份,节省空间,避免不必要的内存分配
  • 提高了程序的效率,编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,效率很高

const 的可变与不可变

const int *p;         //const修饰int,p可变,p指向的int变量的值可变
int const *p;         //const修饰*p(*p也是int变量)。p可变,p指向的int变量的值可变
int* const p;         //const修饰指针p,p不可变,p指向的对象可变
const int* const p;   //指针p和p指向的对象都不可变