[TOC]

文章参考:https://zhuanlan.zhihu.com/p/37514756

文章参考:https://zhuanlan.zhihu.com/p/103215046

概述

​ 定义变量时的限定符,表示变量值不能改变。

1
2
const int bufSize = 512;
bufSize = 512; // 错误:试图向const对象写值

​ 由于const一旦创建就不可更改,所以const对象必须初始化(否则定义一个默认值且不可修改的变量没有任何意义)。

1
2
3
const int i = get_size(); // 正确
const int j = 42; // 正确
const int k; // 错误:未初始化

使用值传递初始化时,被初始化的对象是否为const与初始化对象是否为const无关。也即,const对象与非const对象可以互为初始化。

const修饰一个变量时,一定要给这个变量初始化,若不初始化,在后面也不能初始化。

const作用

  • 可以用来定义常量,修饰函数参数,修饰函数返回值 ,且被const修饰的东西,都受到强制保护,可以预防其它代码无意识的进行修改,从而提高了程序的健壮性(是指系统对于规范要求以外的输入能够判断这个输入不符合规范要求,并能有合理的处理方式。ps:即所谓高手写的程序不容易死);
  • 使编译器保护那些不希望被修改的参数,防止无意代码的修改,减少bug;
  • 给读代码的人传递有用的信息,声明一个参数,是为了告诉用户这个参数的应用目的;

const修饰指针变量

  • const 修饰指针指向的内容,指针常量,内容为不可变量
  • const 修饰指针,则指针为不可变量,即常量指针
  • const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量
1
2
3
例:
int a = 100;
const int *p = &a;

const 修饰的指针变量称为 常量指针

类型去掉, *p当做一个整体 指针的解引用,就是p所指向的值,const修饰的是值,所以指针指向的值不可以更改,指针的指向可以改.

1
2
3
例:
int a = 100;
int *const p = &a;

const 修饰的指针变量称为 指针常量

类型去掉, const修饰的是一个指针,所以指针指向不可以更改,指针的指向的值可以改.

const优点

  • 编译器可以对const进行类型安全检查(所谓的类型安全检查,能将程序集间彼此隔离开来,这种隔离能确保程序集彼此间不会产生负面影响,提高程序的可读性);
  • 有些集成化的调试工具可以对const常量进行调试,使编译器对处理内容有了更多的了解,消除了一些隐患。eg:void hanshu(const int i){…….} 编译器就会知道i是一个不允许被修改的常量
  • 可以节省空间,避免不必要的内存分配,因为编译器通常不为const常量分配内存空间,而是将它保存在符号表中,这样就没有了存储于读内存的操作,使效率也得以提高;
  • 可以很方便的进行参数的修改和调整,同时避免意义模糊的数字出现

constexpr关键字