'this'类型为“Class * const”,即使方法不是const

时间:2013-01-17 16:34:54

标签: c++ const

今天我注意到'this'的类型有些奇怪。如果您有这样的事情:

class C {
    void funcA() {
        funcB(this);
    }

    void funcB(C obj) {
        //do something
    }
};

你当然会得到一个错误,因为funcB()需要一个对象,而'this'是一个指针。我不小心忘记了星号,但对错误信息感到惊讶,因为它说:

no matching function for call to 'C::funcB(C* const)'

当funcA()不是常数时,const来自何处?

5 个答案:

答案 0 :(得分:9)

这就是说this指针本身const - 即你不能修改指针以指向不同的内存。

回到C ++的非常早期历史记录中,在您重载newdelete之前,或者发布了新的展示位置,this是非const指针(至少在ctor内部)。想要处理自己的内存管理的类是通过在构造函数中为实例分配空间,并在退出构造函数之前将该内存的地址写入this来实现的。

在const成员函数中,您要处理的类型为Class const *const this,这意味着this指向的是const(以及指针本身为{{1} }})。

答案 1 :(得分:8)

C* const并不意味着类型C的对象是常量。那将是C const*const C*

C* const表示指针本身是常量。

这是有道理的,因为你无法做到

this = &something_else;

答案 2 :(得分:4)

请注意,它不是C const *,而是C* const。即(从右到左阅读)指向C的常量指针。

答案 3 :(得分:4)

C const*C * const之间存在差异。您需要了解其中的区别:

  • C const*表示它是对象(由指针指向)是常量。
  • C * const表示指针本身是常量。

因此this定义为C * const类型的指针,因此无法对其进行修改,但仍可修改其指向的对象。

答案 4 :(得分:3)

指针本身是常量,而不是指向的数据。