4

今天我注意到“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 来自哪里?

4

5 回答 5

9

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

回到 C++ 的早期历史,在你可以重载newanddelete或放置 new 之前,this是一个非常量指针(至少在 ctor 内部)。想要处理自己的内存管理的类通过在构造函数中为实例分配空间,并this在退出构造函数之前写入该内存的地址来实现。

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

于 2013-01-17T16:37:34.940 回答
8

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

C* const意味着指针本身是常量。

这是有道理的,因为你不能这样做

this = &something_else;
于 2013-01-17T16:37:17.937 回答
4

C const*和之间有区别C * const。您需要了解其中的区别:

  • C const*意味着它是恒定的对象(由指针指向)。
  • C * const意味着它是指针本身是恒定的。

所以this根据定义是一个C * const类型的指针,所以它不能被修改,尽管它指向的对象仍然可以被修改。

于 2013-01-17T16:37:58.267 回答
4

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

于 2013-01-17T16:37:17.093 回答
3

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

于 2013-01-17T16:38:51.650 回答