首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2014-01-12 
const成员函数调用non-const成员函数的疑问当const和non-const成员函数有着实质等价的实现时,令non-const

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函数的设计。并不是不能使用,在写代码的过程中尽量遵循这些设计。

热点排行