const成员函数调用non-const成员函数的疑问
当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。
比如:
class TextBlock{
public:
...
const char& operator[](size_t position) const
{
...
...
return text[position];
}
char& operator[](size_t positon)
{
return
const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);
};
}
...
};
书上说const成员函数调用non-const成员函数是一种错误行为:因为对象有可能因此被改动。
可是如果这样通过const成员函数调用non-const成员函数:
const char& operator[](size_t position) const
{
return
static_cast<const char&>(const_cast<TextBlock&>(*this)[position]);
}
最后返回时被转换成const不是一样不会发生改变吗?
[解决办法]
在功能设计上,“保证不改变”的功能当然不能调用“可能会改变”的功能
const关键字是为了帮助你实现这样的设计,如果你什么地方不小心违反了这个原则,编译器可以提醒你。你可以用无数种方法绕过这个限制,不过我觉得那还不如压根不用const关键字更简单明白:“老子能力无比强大,用不着你编译器多事!”
[解决办法]
如果你确定实质等价,就可以用const_cast来调用,这个language feature就是为了类似的情形设计的。
class TextBlock{
public:
//...
const char& operator[](size_t position) const
{
//...
return text[position];
}
char& operator[](size_t positon)
{
return const_cast<char&>(
const_cast<const TextBlock&>(*this)[position]
);
// the static_cast is not necessary.
// const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);
}
private:
char text[max_text_len];
};