【问题标题】:concept and datatype of 'this' pointer in c++ and c#c++和c#中'this'指针的概念和数据类型
【发布时间】:2014-12-18 13:13:22
【问题描述】:

我对这个指针的概念有点不清楚。 我知道 c++ 中的 this 指针是隐藏指针,它用于引用当前调用对象。但我想知道这个指针是否有数据类型,例如。诠释* p;指出 p 是一个指向整数的指针。同样这个指针指向什么? (我的意思是这个 'this' 指针在哪里声明或写入,或者它存在于哪里以及它是如何写入那里的。)

第二个问题是在 C# 的上下文中 问题是——如果它不是 C# 中的指针,那么 C# 上下文中的“this”是什么(当我尝试使用带有“this”关键字的 -> 箭头运算符时,我发现它不是 C# 中的指针)。 再说一次,C# 中 'this' 的数据类型是什么(我知道上述与 c++ 相关的问题的答案会回答它,但我想知道它在 C# 中是否不同)

P.S :我是一名业余程序员,并且处于学习阶段,因此很抱歉在提问时使用“它是如何编写的”之类的术语而不是适当的技术术语。

【问题讨论】:

  • C# 和 C++ 是不同的语言。为什么你期望它们是一样的?
  • 我不希望它们是相同的。我只想知道它们是如何用两种语言实现的。抱歉,如果问题框架使我认为它们是相同的。
  • 在 C++ 中考虑 this 指针的最简单方法是作为一个额外的隐藏参数。想象一下,您有一个 X 类型的对象 x,其成员函数 foo 接受一个 int 参数。当您执行x.foo(5) 时,实际上就像foo 有两个X*int 类型的参数,而您已经执行了foo(&x, 5)
  • @JosephMansfield:其中棘手的部分是this 上的const 限定实际上并非来自参数x,而是来自X::foo 的声明。您可以在非常量对象上调用 const 方法。

标签: c# c++ this


【解决方案1】:

我想知道这个指针是否有数据类型

隐藏指针this的类型始终是使用该指针的类的类型。比如下面

struct Foo {
    void bar1() {
        cout << this << endl;
    }
    void bar2() const {
        cout << this << endl;
    }
};

thisbar1()里面的类型是Foo*;在bar2() const 里面是const Foo*

同样这个指针指向什么?

它是一个指向当前实例的指针。比如下面

struct Foo {
    void bar() {
        cout << this << endl;
    }
} foo;

bar() 中的指针 this 和表达式 &amp;foo 指向同一个对象。

this 在 C# 的上下文中如果不是指针,它是什么?

C# 没有指针*,但它的对象引用概念相当相似。在 C# 中,this 表示对当前对象的引用。 this 的类型是它被引用的类的类型。

请注意,this 指向的对象的运行时类型可能不同——例如,它可能是子类。但是,指针this 的静态类型与引用指针this 的类的类型相匹配。

* 除非你冒险进入不安全的环境。

【讨论】:

  • @LucasTrzesniewski 感谢您的评论。当您看到诸如缺少星号之类的琐碎问题时,请随时编辑答案-您甚至不需要对此进行批准:)
  • 当然,但在这种情况下,我认为这是一个真正的错误;)
  • 任何 cv 限定在技术上也是指针类型的一部分。
  • @MSalters 已编辑。谢谢!
【解决方案2】:

在 C++ 中,this 指针是传递给所有非静态成员函数的隐式参数(作为隐藏参数传递给它们)。在这里查看更多解释:http://www.tutorialspoint.com/cplusplus/cpp_this_pointer.htm 和这里:http://www.geeksforgeeks.org/this-pointer-in-c/http://msdn.microsoft.com/en-us/library/y0dddwwd.aspx

在 C# 中,“this”是一个保留关键字,它是对运行该方法的对象的引用。正如您在 C# 中所知道的,您不使用指针,而是使用对对象的引用。

【讨论】:

    【解决方案3】:

    恕我直言,这是一个有用的参考,它很好地描述了这个问题:MSDN

    【讨论】:

    • 请不要发布仅链接的答案。
    • 对不起。我认为在这里重写相同​​的文本是个坏主意
    • @Nickon:是的。不过,总结要点是个好主意。
    【解决方案4】:

    是的,C++ 中的this 指针有一个类型。

    class A
    {
    public:
      void func() {}
    }
    

    func 内部的this 类型是:-

    A * const          //for non-const functions.
    A const * const    //for const functions.
    

    【讨论】:

    • 虽然它的行为类似于A * const,但从技术上讲,这并不是因为它是右值:see here
    【解决方案5】:

    this 肯定是 C++ 中的一个指针,在 Foo 类中,它将属于 Foo * 类型,除非您使用的是 volatileconst 方法 - 在这种情况下,这两个修饰符将传播到this 类型。

    同样在 C# 中this 只是当前对象类型的一个神奇的引用变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多