问题标签 [this-pointer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在 C++ 中删除此指针的行为
我正在尝试在 c++ 中探索这个指针。我创建了一个指向类对象的指针并调用了一个函数来删除当前对象,但行为是意外的。
为什么最后一个打印语句的输出是 x= 0 , y= 6。
c++ - 编译器的 this 指针和虚函数的详细信息
我正在阅读 Bjarne 的论文:“ Multiple Inheritance for C++ ”。
在第 3 节第 370 页中,Bjarne 说“编译器将成员函数的调用转换为带有“额外”参数的“普通”函数调用;“额外”参数是指向成员函数所针对的对象的指针叫做。”
考虑一个简单的类A
:
成员函数 A::f 的调用:
由编译器转换为“普通函数调用”:
pa 作为 this 指针传递。上面的例子很容易理解。
考虑以下代码片段:
问题一:
成员函数 A::f 的调用:
由编译器转换为“普通函数调用”:
this 指针是 *pc 还是 (*B)pc?另一个问题是编译器如何知道成员函数在哪里?
让我们通过添加 virtual 关键字使上面的示例更有趣。
一个 c 类对象 C 看起来像:
C:
对虚函数的调用被编译器转换为间接调用。例如,
变成这样:
Bjarne 的论文告诉了我上述结论。
问题2:
(1) 在 vtbl 中,我相信这些函数指针是在运行时分配的。编译器如何知道第二个函数指针应该指向 B 类对 g 的实现?编译器如何计算它?
(2) 在上面的例子中,所有成员都是 int,我们假设编译器为 int 分配了 4 个字节的内存。如果成员是 char,编译器是否仍为 char 分配 4 字节内存?还是只有一个字节?
(3) (*((*pc)[1]))(pc, 2)
、这里的this指针是pc,为什么不是(*B)pc呢?传递这个指针有什么规则吗?
谁能帮我回答这些问题?对此,我真的非常感激。我明天有一个截止日期,这真的与这些问题有关。请帮忙!!!
c++ - 编译器对 this 指针、虚函数和多重继承的详细说明
我正在阅读 Bjarne 的论文:Multiple Inheritance for C++。
在第 3 节第 370 页中,Bjarne 说“编译器将成员函数的调用转换为带有“额外”参数的“普通”函数调用;“额外”参数是指向成员函数所针对的对象的指针叫做。”
我对这个额外的论点感到困惑。请看以下两个例子:
示例 1:(第 372 页)
一个 c 类对象 C 看起来像:
C:
对虚函数的调用被编译器转换为间接调用。例如,
变成这样:
Bjarne 的论文告诉了我上述结论。通过this
点为 C*。
在下面的例子中,Bjarne 讲述了另一个让我完全困惑的故事!
示例 2:(第 373 页)
给定两个类
C 类的对象可以像这样布置为连续的对象:
在给定 C* 的情况下调用 B 的成员函数:
Bjarne 写道:“自然,B::bf() 期望 B*(成为它的 this 指针)。” 编译器将调用转换为:
为什么在这里我们需要一个 B* 指针作为this
? 如果我们只是将 *C 指针作为 传递this
,我认为我们仍然可以正确访问 B 的成员。例如,要在 B::bf() 中获取类 B 的成员,我们只需要执行以下操作:*(this+offset)。编译器可以知道这个偏移量。这是正确的吗?
跟进示例 1 和 2 的问题:
(1)当它是一个线性链推导时(示例1),为什么可以期望C对象与B和A子对象位于同一地址?在示例 1 中使用 C* 指针访问函数 B::g 中的类 B 的成员没有问题吗?比如我们要访问成员b,运行时会发生什么?*(pc+8)?
(2)为什么我们可以对多重继承使用相同的内存布局(线性链推导)?假设在示例 2 中,类A
, B
,C
具有与示例 1 完全相同的成员。A
:int a
和f
; B
:int b
和bf
(或称它为g
);C
:int c
和h
。为什么不直接使用内存布局,例如:
(3) 我写了一些简单的代码来测试线性链推导和多重继承之间的区别。
它表明pa
和具有相同pb
的pc
地址。
现在,pc
andpa
具有相同的地址,而与and有pb
一些偏移。pa
pc
为什么编译会产生这些差异?
示例 3:(第 377 页)
(1)第一个问题pc->g()
与示例2中的讨论有关。编译是否进行以下转换:
或者我们必须等待运行时来执行此操作?
(2) Bjarne 写道: 在入口处C::f
,this
指针必须指向C
对象的开头(而不是B
部分)。但是,在编译时通常不知道B
by 指向的pb
是 a 的一部分,C
因此编译器不能减去常量delta(B)
。
为什么我们不能在编译时知道B
指向的对象pb
是 a 的一部分?C
根据我的理解,B* pb = new C
,pb
指向创建的C
对象并C
继承自B
,因此B
指针 pb 指向C
.
(3) 假设我们在编译时不知道B
指向 by的指针pb
是 a 的一部分。C
所以我们必须存储运行时的 delta(B),它实际上与 vtbl 一起存储。所以 vtbl 条目现在看起来像:
比亚恩写道:
我在这里完全糊涂了。为什么 (B*) 不是 (C*) 在(*vt->fct)((B*)((char*)pb+vt->delta))
???? 根据我的理解和 Bjarne 在第 5.1 节第 377 页的第一句的介绍,我们应该在this
这里传递一个 C* !!!!!!
紧接着上面的代码片段,Bjarne 继续写道: 注意,在寻找指向 vtbl 的成员之前,可能需要调整对象指针以指向正确的子对象。
天啊!!!我完全不知道 Bjarne 想说什么?你能帮我解释一下吗?
c++ - 多重继承的虚方法表
我正在阅读这篇文章“虚拟方法表”
上述文章中的示例:
在文章中,作者介绍了object的内存布局d
是这样的:
问题是关于d->f2()
。调用d->f2()
将B2
指针作为this
指针传递,因此我们必须执行以下操作:
为什么我们应该将B2
指针作为this
指针而不是原始D
指针传递???我们实际上是在调用 D::f2()。根据我的理解,我们应该传递一个D
指向this
D::f2() 函数的指针。
___更新____
如果传递一个B2
指向this
D::f2() 的指针,如果我们想访问B1
D::f2() 中的类成员怎么办?我相信B2
指针(this)显示如下:
它已经有了这个连续内存布局的起始地址的一定偏移量。例如,我们想访问b1
D::f2() 内部,我猜在运行时,它会做类似的事情:(*(this+4)
指向this
与 b2 相同的地址) 这将b2
指向B
????
php - PHP $this 在类内部使用来引用类
我loadModule();
在 class 中有一个函数core
,但是要加载模块,我需要在构造中定义变量,其中许多需要 core. 我会简单地使用loadModule("someModule", $settings, $dbc, $core, $etc...);
还是loadModule("someModule", $settings, $dbc, $this, $etc...);
因为这个函数在 $core 定义的核心类中?我现在很困惑,不胜感激。谢谢
编辑:
预期用途看起来像
$this->core->loadModule("initialLoad, $settings, $version, $dbc, $parser, $layout);
模块构造看起来像
c++ - C++ *this的值类别是什么?
C++ 标准的第 9.3.2.1 节规定:
在非静态 (9.3) 成员函数的主体中,关键字 this 是一个纯右值表达式,其值是调用该函数的对象的地址。类 X 的成员函数中 this 的类型是 X*。如果成员函数声明为 const,则 this 的类型为 const X*,如果成员函数声明为 volatile,则 this 的类型为 volatile X*,如果成员函数声明为 const volatile,则 this 的类型为 const挥发性 X*。
那么如果this
是纯右值,它的值类别是*this
什么?以下建议即使对象是右值,*this
也始终是左值。它是否正确?如果可能,请参考标准。
输出:
c++ - 这个指针是0xfffffffc,可能的原因?
我正在编译 Crypto++ 库-O3
。根据 Undefined Behavior Sanitizer (UBsan) 和 Address Sanitizer (Asan),它可以。该程序在-O2
(以及-O3
在许多平台上)运行良好。
根据 Valgrind 的说法,它也可以-O2
。在-O3
,Valgrind 以“您的程序只是试图执行 Valgrind 不理解的指令”而死。我相当肯定这是因为 SSE4 指令和-O3
.
但是,我在某些平台上遇到了崩溃-O3
。这台机器是 Fedora 22 i686,它有 GCC 5.2.1。有问题的框架显示this=0xfffffffc
:
据我所知,该地址周围没有任何东西:
我已经看到this=0x00000000
在一个翻译单元中声明的静态类对象是否在初始化完成之前在另一个翻译单元中使用。但我不记得0xfffffffc
以前见过。
有哪些潜在原因this=0xfffffffc
?或者我该如何进一步排除故障?
c++ - 未将此指针设置为 const 的构造函数会导致未检测到的问题
将我的课程减少到最低限度以提高可读性:
在 MessageFolder.cpp 中
在定义const
. 的messages
构造函数Message
不假定指针。因此,即使是非功能代码const
this
addToFolders
const
会编译得很好。这里有一个问题,因为b
是一条const
消息,但是复制构造函数将b
的地址(通过addToFolders()
)设置为由 a 组成的文件夹set
-Message*
低级别const
丢失了。事实上,如果我要定义一个函数Folder
来更改底层消息,我可以更改contents
const Message的,b
看似没有编译错误。
一个解决方案是将Folder
' 设置更改为,set<const message*>
但这不允许我通过文件夹更改消息(我确实希望这样做)。我将如何防止message
创建 const 对象,或者更好的是,强制this
构造函数中的指针const
失败addToFolders()
?
c++ - 'this' 是局部变量吗?
这里我举一个重载自增运算符的例子:
我被告知不能返回局部变量。“this”不是局部变量吗?这是我的想法:
数字类型的指针附加到成员函数(重载的运算符函数)。当编译器看到 ++my_dig 行时,即 Digit 类的一个实例,它会调用成员函数。my_dig 实例的地址作为参数传递给函数,并且有一个名为“this”的隐藏“const Digit*”来捕获参数。"this" 被取消引用(隐式)以访问 m_digit,它是 Digit 类的成员变量。所有的增量或包装都在函数内部完成,然后对取消引用的“this”的引用返回给调用者。是的,这就是我困惑的地方。如果“this”是一个 const Digit* 类型的局部变量,它是否应该在返回时包含垃圾,因为“this”超出了块结束的范围 haaa?
c++ - C++ 循环遍历对象的地址
对象(非动态的)是内存中的数据块。
有没有办法循环并打印对象中的每个项目?
我试着用'this'来做,但我不断收到错误。
我猜错误是因为类型不匹配。但我真的想不出解决办法。是否有动态类型,或者我必须以某种方式测试类型?