定义:html
const 主要用于声明常量。当常量为对象时,对象值不可改变;当常量为指针时,该指针不可移动或从新赋值,但咱们能够经过它去修改该指针的指向对象的值(前提是无需移动指针的修改)。所谓的形参、返回值、成员变量均是变量,所以当const修饰他们时,亦属于常量范畴。不过常成员变量必须在类的构造函数的初始化列表中进行初始化。安全
const 还可用于声明类的常成员函数。该常成员函数不能修改类中任何非const成员变量及调用非const成员函数。函数
语法格式:spa
常量为对象时:指针
const Type M=常量值(表达式)或Type const M=常量值(表达式);htm
const Type *M=指针对象地址或Type const *M=指针对象地址;对象
常量为指针(常指针)时:blog
Type * const M=指针对象地址;内存
理解该语法格式先要了解类型修饰符的优先级及结合方向的几个概念。const 是一个左结合的类型修饰符,它与其左侧的类型修饰符合为一个类型。* 是一个右结合的指针类型修饰符,&是一个右结合的引用类型修饰符,二者处于同一优先级。[]优先级比*高,因此当变量中含有[]时,M一般先和[]结合。声明的结合开始点为变量名M。所以,const 放在Type先后是无区别的,但当const放在指针符*左侧时const与type结合,则表示修饰的是指针内容.当const放在指针符*右侧时const与*结合,则表示修饰的是指针自己。相似的结合应用于&。get
类的常成员函数时:
返回值 函数名(形参)const;
做用:
使编译器很天然地保护那些不但愿被改变的参数,防止其被无心的代码修改。简而言之,加强程序的健壮性,减小bug的出现。
与define区别:
(1) 编译器处理方式不一样
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不一样
define宏没有类型,不作任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不一样define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。const常量会在内存中分配(能够是堆中也能够是栈中)。