C++类体系中this指针不能改变指向吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++类体系中this指针不能改变指向吗?相关的知识,希望对你有一定的参考价值。

this指针可以作强制类型转换,那么this指针可以改变指向否?多谢解答!

有点意思,举个例子:
int i;
如上,随便定义一个变量,现在,你能改变变量i的地址么?原则上,从高级语言的角度来说,改变i的地址是不可能的,因为i的地址是编译器设定的。同样,如果i是某个类的对象,一样不能改变i的地址,而this指针就是对象地址的别名,因此通常无法改变。我说“通常”是指在C++语言这个层面上是无法改变的,除非你对C++编译器编译完的目标代码进行修改。另外,如果你想改变this的指向,也不需要直接修改this,而只需要将this加上某个偏移值就行了,比如(this+12)->funname();但是要考虑到指针的安全性问题。希望回答对你有帮助。
参考技术A 不可以,this指针是系统自动生成的,指向对象,而且只能在成员函数当中使用,生命周期也与成员函数相同,希望我的回答对你有所帮助 参考技术B 系统自己定义的指针

C++ - 指向类方法的指针

【中文标题】C++ - 指向类方法的指针【英文标题】:C++ - Pointer to a class method 【发布时间】:2009-10-25 21:02:28 【问题描述】:

我必须设置一个指向库函数 (IHTMLDocument2::write) 的指针,这是 IHTMLDocument2 类的一个方法。 (对于好奇的人:我必须用 Detours 来挂钩该功能)

我不能直接这样做,因为类型不匹配,我也不能使用强制转换(reinterpret_cast<> 这是“正确的”afaik 不起作用)

这是我正在做的事情:

HRESULT (WINAPI *Real_IHTMLDocument2_write)(SAFEARRAY *) = &IHTMLDocument2::write

感谢您的帮助!

【问题讨论】:

我的经验是,为了指向一个类方法,该方法必须是静态的。 @圣哈辛托。这不是真的。您可以拥有指向普通方法的指针。 【参考方案1】:

指向函数的指针有以下类型:

HRESULT (WINAPI IHTMLDocument2::*)(SAFEARRAY*)

如您所见,它是由它的类名限定的。它需要一个类的实例来调用(因为它不是静态函数):

typedef HRESULT (WINAPI IHTMLDocument2::*DocumentWriter)(SAFEARRAY*);

DocumentWriter writeFunction = &IHTMLDocument2::write;

IHTMLDocument2 someDocument = /* Get an instance */;
IHTMLDocument2 *someDocumentPointer = /* Get an instance */;

(someDocument.*writefunction)(/* blah */);
(someDocumentPointer->*writefunction)(/* blah */);

【讨论】:

好的...工作正常...非常感谢!现在我必须创建一个新函数,其类型为:HRESULT (WINAPI IHTMLDocument2::*)(SAFEARRAY*) 这可能来自类外吗?【参考方案2】:

您需要使用member function pointer。普通函数指针不起作用,因为当您调用(非静态)类成员函数时,有一个隐含的 this 指针指向该类的实例。

【讨论】:

+1 用于解决我评论过的问题......但让我对 C++ 感到畏缩,因为它引入了另一个要学习的语法项目。有什么意义呢?保证封装安全? 成员函数指针似乎并不经常使用,但它们确实有其用途。例如, boost::bind 利用成员函数指针,因此您可以这样做,例如 boost::bind(&Foo::somefunction, &instance, arg1, arg2) @San:成员函数指针 (MFP) 的处理方式与普通函数指针不同,因为它们 不同......这不仅仅是语法糖。 MFP 的大小通常更大(8 或 12 字节 vs 32 位机器上的 4 字节),它们传递一个隐式 this 指针,通常它们通过一小块 thunking 代码而不是直接调用(因此它们可能调用虚函数) .因此,它们在内存方面和 CPU 性能(调用成本)方面都比普通函数指针更昂贵。 它们作为回调处理程序特别有用。另外,烦人的语法可以通过使用 boost::mem_fn 或 boost::bind 来缓解。 谢谢大家。对我来说是一个很好的起点。

以上是关于C++类体系中this指针不能改变指向吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中 this* 的类型

C++中怎么获取类的成员函数的函数指针

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

this指针是指向虚函数表的指针

C++多态与this指针问题

C++ 类设计总结回顾------this指针