Keywords: const
const
的作用: 用于修饰某某东西不变
使用 const
修饰成员函数
const
关键字, 只有在成员函数中能有如下写法:retureType functionName(argType &...args) const {}
. 即只有成员函数中能够使用上述的const
用法, 来表明, 该成员函数不会对成员本身的数据进行修改
一个良好的设计习惯本身就要求, 对所有不会对类进行修改的成员函数使用上述 const
进行修饰. 然而, 在这里不仅仅是为了更好, 还是为了不出错.
非常量成员可以调用常量成员函数, 反之, 常量成员调用非常量成员函数会报错
1
cannot convert 'this' pointer from 'const class 类名` to 'class 类名&'
额外信息: 成员函数同时存在非常量与常量两种版本时, 常量成员只能调用常量函数, 非常量成员只能调用非常量函数. 而这又给出了更多的信息, 即成员函数的签名包含了后方是否修饰的
const
我们可以考虑一下这样设计的目的, 其中 STL 中针对 basic_string
中有如下重载代码:
1
2
3
4
5
6
7
8
9
10
charT operator[](size_type pos) const
{
// 省略实现
// 无需考虑 COW: copy on write
}
reference operator[](size_type pos)
{
// 省略实现
// 必须考虑 COW: copy on write
}
STL 中对
basic_string
的实现方式是引用计数( Reference-Counting ), 即多个相同的字符串共享同一个引用. 因此如果是一个被const
修饰的静态变量, 对它的操作就无需考虑会对共享的引用进行修改的情况. 反之, 若不是一个静态变量, 则需要考虑在写的时候拷贝( COW )一个同样的引用, 从而避免对其他字符串的影响.
This post is licensed under CC BY 4.0 by the author.