【问题标题】:Type of "this" in c++? [duplicate]c++ 中“this”的类型? [复制]
【发布时间】:2013-06-17 11:33:20
【问题描述】:
struct Foo
{
 void f()
 {
 // (*)
 }
};

标有 (*) 的行中的“this”是什么类型?

const Foo* 还是 Foo*

【问题讨论】:

标签: c++


【解决方案1】:

n3376 9.3.2/1

在非静态 (9.3) 成员函数的主体中,关键字 this 是纯右值表达式,其值 是调用函数的对象的地址。

成员函数中this的类型 类 X 是 X*。如果成员函数声明为 const,则 this 的类型为 const X*,如果成员 函数声明为 volatile,this 的类型为 volatile X*,如果声明了成员函数 const volatile,this的类型是const volatile X*。

【讨论】:

  • 这让我想知道他们为什么不将this 设为常量指针...有什么特别的原因吗?
  • @TomKnapen this 是一个右值,所以无论如何你都不能修改它。对于大多数意图和目的,它表现为X * const。但是你不能以它的地址为例。
  • @TomKnapen:不。事后看来,它应该是一个参考,而不是一个指针。但是this 早于引用,不破坏现有代码的 C++ 传统真的很古老。
  • @TomKnapen 将值设为 const 是没有意义的。可以改变什么?可以将值更改为其他值吗?或者可以将对象更改为包含其他值吗?是前者,而前者只能是const(它有一个lifetime,在此期间它没有不同的值)。
  • 表达式的类型获取对象的常量,然后将是常量类型。请参阅 4.1p1 上的说明
【解决方案2】:

f 内部,this 的类型为Foo *,因为f 不是const 成员函数。

您不能在 const Foo 对象上调用 f。以下是错误的:

 const Foo obj;
 obj.f();

这正是因为在Foo::f内部,this指针是Foo *而不是const Foo *,所以函数调用需要指针转换,它会丢弃限定符。

this 指针本身不是变量。它是不可分配的,但不是因为 const 限定符。范围内没有声明,例如Foo *const this。根据语言规则,this 表达式根本不是左值。

this 指针与&obj 没有太大区别。

【讨论】:

    【解决方案3】:

    this 的类型取决于成员函数。

    例如对于一个类X,如果成员函数是

    1) const,则 this 的类型为 const X*

    2) volatile,那么 this 是 volatile X* etc

    否则为 X*

    【讨论】:

      【解决方案4】:

      this 引用当前对象。 c++ 中this 的类型是Foo *const

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-14
        • 2013-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-18
        • 2017-01-08
        • 1970-01-01
        相关资源
        最近更新 更多