crazy_fz const_cast
有个用法就改变对象的常量属性.
比如说:
#include <iostream>
using namespace std;
class Student {
private:
int score;
public:
// constructor
Student(int score)
: score(score)
{
}
void cheat() const
{
// 将常量对象转成非常量对象 前提是this的底层是可变的.
// 如果this的底层是常量, 这样的操作是未定义的. 也就是不安全的!
(const_cast<Student*>(this))->score = 60;
}
int get_score() { return score; }
};
int main(void)
{
Student john(59); // 可变对象
cout << "Old score number: " << john.get_score() << endl;
john.cheat(); // cheat声明为const函数, 默认情况下是不能修改john的属性. 但是他的工作需要修改某个属性的值.
// 想象一下, 有个函数只返回某个属性的值(完全可以声明为const方法), 但是同时我希望利用内部的一个状态记录他的调用次数. 所以这样的函数完全有可能存在.
cout << "New score number: " << john.get_score() << endl;
return 0;
}
如何解决上边的问题... 答案是不要用const_cast
, 用mutable
关键字.
#include <iostream>
using namespace std;
class Student {
private:
mutable int score;
public:
// constructor
Student(int score)
: score(score)
{
}
void cheat() const
{
score = 60; // 在const对象内可变.
}
int get_score() { return score; }
};
int main(void)
{
Student john(59); // 可变对象
cout << "Old score number: " << john.get_score() << endl;
john.cheat();
cout << "New score number: " << john.get_score() << endl;
return 0;
}
总之, 随意改变一个对象的常量属性是很不安全的一件事, 所以个人觉得const_cast
和C风格的强制转换一样, 是不安全的. 只是const_cast
是塔利班, 强制转换是伊斯兰国, 后者更加危险罢了.