1.什么是成员函数的常量性?
关于成员函数的常量性当前有两个流行的概念(1)bitwise constness(又称physical constness) (2)logical constness
(1)什么称之为bitwise constness ?
bitwise constness 是指 ,成员函数只有在不更改对象的任何成员变量(static 除外,因为类的static 变量属于类 而不属于对象)时才可以说成员函数具有常量性。也就是说成员函数不更改对象内的任何一个bit。对于 bitwise constness 来说,编译器很容易可以看出成员函数是否具有常量性:编译器只要寻找 成员函数内 是否对成员变量有赋值行为即可。如果在成员函数内对 成员变量进行赋值操作,那么这个成员函数就不具有常量性,并且bitwise constness 正是c++对常量性的定义。所有const 成员函数不可以更改对象内的任何 non-static 成员变量。
(2)什么称之为logical constness?
但是在实际编程过程中,我们发现很多成员函数虽然不具备常量性,但可以通过 bitwise constness 常量性的测试。例如 一个更改了“指针所指内容”的成员函数显然不能算是常成员函数,但如果只有指针本身属于对象,指针所指的内容并不属于对象 那么依照bitwise constness方式 来理解常成员函数的编译器并不会报错,这显然不符合常成员函数的定义,因为成员函数 已经修改了成员变量(指针本身并没有发生改变,但是指针所指的内容已经发生改变)这和我们理解的常成员函数并不相符。这种情况导致了 常成员函数的逻辑常量性(logical constness)。
常成员函数的逻辑常量性(logical constness): 是指一个常成员函数可以修改它所处理对象内的某些位(bits),但是只有在程序的使用者检测不出来的情况下才行,因为目前c++编译器 检测成员函数的常量性都是按照 bitwise constness来检测,当常成员函数对成员变量进行修改时,显然不能通过编译器编译。为了支持常成员函数的逻辑常量性,c++引入了mutable 关键字来对去掉成员变量的常量性。所以想在常成员函数中对成员变量进行修改 我们必须在想要修改的成员变量之前有关键字 mutable 来进行修饰。
参考: effective c++ Third Edition