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;
;
this
在bar1()
里面的类型是Foo*
;在bar2() const
里面是const Foo*
。
同样这个指针指向什么?
它是一个指向当前实例的指针。比如下面
struct Foo
void bar()
cout << this << endl;
foo;
bar()
中的指针 this
和表达式 &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 *
类型,除非您使用的是 volatile
或 const
方法 - 在这种情况下,这两个修饰符将传播到this
类型。
同样在 C# 中this
只是当前对象类型的一个神奇的引用变量。
【讨论】:
以上是关于c++和c#中'this'指针的概念和数据类型的主要内容,如果未能解决你的问题,请参考以下文章
C++:对象和类|| this指针对象数组类作用域抽象数据类型章末总结