成员函数如何传递“this”指针

时间:2014-02-21 15:23:12

标签: c++ function pointers const this

假设我有一个类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的指针。任何见解都表示赞赏。

2 个答案:

答案 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