const
总体来说,const 就是限定符,表明不可修改,更容易阅读、维护,更安全。
常量
取代了 C 语言里面的宏定义。
存储在常量区,编译器甚至可以不给它分配空间,如果编译器已经知道了常量的值,而且足够简单,不需要分配空间,可把代码优化掉。
指针
const 修饰指针类型,表示限定不可以修改指向的原始对象,不可以给非 const 指针类型赋值。
const 修饰指针名,表示指针本身不可改变,声明即初始化,也不可以自增自减。
函数入参
这个对指针参数最常用,如果函数不需要修改指针指向的原始对象,换言之,只读不写,那么应该在类型前加上 const 限定,避免修改原始对象,增加可读性的同时,避免日后维护不当引入副作用。
引用参数同理,加上 const 限定,只可读不可写。
除了指针和引用,一般的类型也可声明为 const 保证一旦调用函数,入参被赋值,在函数内部就无法被误操作而篡改。
返回值
也可以修饰函数返回值,调用处也需要用常量来接收函数返回值。这个不推荐的,不应该去限定调用端的代码,除了重载操作符需要返回某个对象的 const 引用。这个比较复杂了,涉及到左值右值等。
类内的使用
用 const 在参数列表后面修饰函数,编译器将不允许这个函数修改类的数据成员。
如果一个对象是常量,那么它也无法调用非常量函数,只能调用常量函数。
当然了,这种编译器的限制是可以绕过去的,最重要还是开发者自己要严格遵守使用规则,那这样的特性才真正能够方便开发者阅读代码,理解代码,使用起来也更安全。
如果个别数据成员就是跟别人不一样,就是要被修改的,除他们外,其它数据成员都可以严格区分常量和非常量,那么,这些数据成员应该用 mutable 修饰,这样,编译器就允许 const 函数修改这些变量了。
关于重载:
如果一对儿重载函数,只有 const 声明不一样,其它都一样,一个是 const 函数,一个是非 const 函数,那么当对象调用这个函数时,如果对象是变量,那么调用非 const 修饰的函数,如果对象是常量,那么调用 const 函数。