如果想建立一个const成员函数,但是还想在对象中改变某些数据,这时候该怎么办呢?
这种情况涉及到按位const与按逻辑const
按位const是指对象中的每个字节都应该是固定的,按逻辑const是指对象从概念上讲是不变的,但是可以以成员为单位进行改变
当某个对象是const对象时,就指定了应该按位const,但我们可以用某种方法使之改变成按逻辑const
方法一被称为“强制转换常量性”,代码如下:
//: C08:Castaway.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// "Casting away" constness
class Y {
int i;
public:
Y();
void f() const;
};
Y::Y() { i = 0; }
void Y::f() const {
//! i++; // Error -- const member function
((Y*)this)->i++; // OK: cast away const-ness
// Better: use C++ explicit cast syntax:
(const_cast<Y*>(this))->i++;
}
int main() {
const Y yy;
yy.f(); // Actually changes it!
} ///:~
方法二是 使用关键字mutable,以指定一个特定的数据成员可以在一个const对象中改变,代码如下:
//: C08:Mutable.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// The "mutable" keyword
class Z {
int i;
mutable int j;
public:
Z();
void f() const;
};
Z::Z() : i(0), j(0) {}
void Z::f() const {
//! i++; // Error -- const member function
j++; // OK: mutable
}
int main() {
const Z zz;
zz.f(); // Actually changes it!
} ///:~