【问题标题】:'this' of type "Class* const" even though method is not const'this' 类型为“Class* const”,即使方法不是 const
【发布时间】:2013-01-17 16:34:54
【问题描述】:

今天我注意到“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从何而来?

【问题讨论】:

  • 这是对的,因为 this 是不变的。例如,你不能这样做:this = 0;

标签: c++ constants


【解决方案1】:

也就是说this指针本身const——也就是说,你不能修改指针指向不同的内存。

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

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

【讨论】:

  • 技术上这是不正确的。 this 不是常量指针,它是一个表达式 (prvalue),它产生一个指向调用成员方法的对象的指针。但是,是的,实现可能是创建一个常量指针,并将其命名为 this...(尽管标准表示表达式 this 的类型是指向可能为 const-volatile 限定对象的非 const 指针)
【解决方案2】:

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

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

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

this = &something_else;

【讨论】:

    【解决方案3】:

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

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

    所以this定义为C * const类型的指针,所以它不能被修改,虽然它指向的对象仍然可以被修改。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2018-05-20
          • 2015-12-07
          • 1970-01-01
          • 2011-03-29
          • 2020-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多