c++和c#中'this'指针的概念和数据类型

Posted

技术标签:

【中文标题】c++和c#中\'this\'指针的概念和数据类型【英文标题】: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 方法。 【参考方案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 只是当前对象类型的一个神奇的引用变量。

【讨论】:

以上是关于c++和c#中'this'指针的概念和数据类型的主要内容,如果未能解决你的问题,请参考以下文章

C++:对象和类|| this指针对象数组类作用域抽象数据类型章末总结

C++类和对象(类的介绍用法等及this指针)详细解读

C++类和对象(类的介绍用法等及this指针)详细解读

C++类和对象(类的介绍用法等及this指针)详细解读

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

C++学习-指针的概念和定义方法