读书人

const成员函数调用non-const成员函数的

发布时间: 2014-01-12 00:03:16 作者: rapoo

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];
};


上面是典型的用法,在标准库里类似的应该可以找到大把
[解决办法]
人家可没说只使用你这个例子啊,如果非const函数操作比较复杂,内部改变成员变量状态,怎么办?
[解决办法]
基本没有此类需求,有的话也可以const api + mutable解决。
[解决办法]
引用:
Quote: 引用:

实质等价的话,non const版本没有必要存在。

那如果需要进行赋值呢?
TextBlock tb("asd");
tb[0]='x';
如果返回类型是const引用,是不能对其赋值的吧。


那时因为不等价.
[解决办法]
书上说const成员函数调用non-const成员函数是一种错误行为:因为对象有可能因此被改动。

这只是预防为主的行为,并不是说这种行为被编译器否定,为了防止成员变量被修改,调用非const函数就是某种意义上的错误行为,从设计的角度来说违背了const函数的设计。并不是不能使用,在写代码的过程中尽量遵循这些设计。

读书人网 >C++

热点推荐