非const版本调用const版本函数,可以减少代码重复
源自effective c++ 条款3 : 尽可能使用const
原始实现:
Class ClassA {
string text;
public:
ClassA(string s) : text(s){};
const char& operator[] (size_t position) const // const版本
{
... 做一些额外的事情
return text[position];
}
char& operator[] (size_t position) // 非const版本
{
... 做一些额外的事情
return text[position];
}
}
改变后:
Class ClassA {
string text;
public:
ClassA(string s) : text(s){};
const char& operator[] (size_t position) const
{
... 做一些额外的事情
return text[position];
}
char& operator[] (size_t position) // 非const版本通过const版本实现
{
// 首先static_cast将*this对象转型为const对象,然后调用const版本operator[]返回const引用
// 然后用const_cast去掉返回值的const属性
return const_cast<char&>(static_cast<const ClassA &>(*this)[position]);
}
}
反过来:const调用非const来实现(不安全,不推荐)
class ClassA {
string text;
public:
ClassA(string s) : text(s){};
char& operator[] (size_t position)
{
//... 做一些额外的事情
return text[position];
}
const char& operator[] (size_t position) const
{
return (const_cast<ClassA &>(*this))[position];
}
};
- non-const版本调用const版本来实现,减少了代码的冗余。
- 为什么不先实现non-const版本,在通过non-const版本实现const版本?
- non-const调用const版本时,const版本保证了数据的const属性,而const版本调用non-const版本时,non-const版本可能会改变对象的成员值。
- 如果使用non-const版本实现const,首先需要将*this强转成non-const: static_cast<ClassA &>(this),这样直接去掉this对象的const属性具有不安全性。
备注:
- 将一个const值转换为非const值 比 将一个非const值转换为const的值 更安全, 因为将一个非const的值转换为const的时候非const的值可能发生变化。而const转成非const,const保证了变量的常量性。