假设我有一个类Foo
,它有一个成员函数,它返回一个非const引用,它本身运行一个使用const this
指针的成员函数:
class Foo{
public:
Foo& display(std::ostream& os) { do_display(os); return *this; }
private:
void do_display(std::ostream& os) const { os << contents; }
std::string contents;
}
当display
运行do_display
时,this
指针会被隐式转换为指向const的指针。那么,为什么当do_display
终止时,display
仍然能够更改它被调用的对象?据我所知,不可能将指向const的指针正常分配给指向非const的指针。任何见解都表示赞赏。
答案 0 :(得分:2)
转换display
中的非const指针以将其传递给do_display
会创建一个不同类型的新指针;它不会改变现有指针的类型。将this
传递给成员函数与将参数传递给非成员函数非常相似:
// A non-const member function receives `this` as a non-const pointer
Foo& display(Foo * this, std::ostream & os) {
// Pass a copy of `this`, converted to `Foo const *`
do_display(this, os);
// The local `this` is still `Foo *`
return *this;
}
// A const member function receives `this` as a const pointer
void do_display(Foo const * this, std::ostream & os) {os << this->contents;}
答案 1 :(得分:0)
在C ++中const
访问通常只是编译时属性 [1],它是为了简化对象状态的控制而引入的。 [2]
方法do_display()
不会更改this
的任何内容,但会限制其范围内的只读权限。在返回do_display()
方法的调用之后,访问权限就像以前一样在display()
方法的范围内进行读写。
[1]这就是cast const away选项的原因,如果constness 只是一个声明性的,那么可以认为是安全的。
[2]请参阅Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition): Scott Meyers中的第3项或Const Correctness - C++ Tutorials - Cprogramming.com