关于*this,面试时的一个问题

眼睛猥琐男 2010-05-17 05:45:30
this 调用成员函数会否默认调用*this?

上面是:面试时的一个问题,怎么回答?
...全文
454 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
icoding 2010-05-18
  • 打赏
  • 举报
回复
这个问题,我是专家了,任何一个非静态成员函数的调用都会有this传递,本质上成员函数就是个普通函数,函数需要知道自己处理的数据在哪里
ithiker 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 lnuyasha_hrb 的回复:]

通过this指针访问
以下是代码段
C/C++ code

#include "stdafx.h"

using namespace std;

class A{
public:
A(){};
void g(){f();}
void f(){cout<<"A::f()"<<endl;}
~A(){}
};

int _tmain(int argc, _TCH……
[/Quote]

类的成员函数被调用时第一个省略参数是该类的地址,也就是this
lllsui 2010-05-18
  • 打赏
  • 举报
回复
o o
眼睛猥琐男 2010-05-18
  • 打赏
  • 举报
回复
首先十分感谢大家参与,学到了很多东西。 昨晚睡着了没结贴,*_* 。准备结贴了。总结一下,希望对大家都有帮助。
正如lnuyasha_hrb贴的代码,看g()函数:
class A{
public:
A(){};
void g()
{
f();
(*this).f();
this->f();
}
void f(){cout<<"A::f()"<<endl;}
~A(){}
};

其实那个面试题的意思就是在g()中调用f()时究竟是采用this->f();还是(*this).f(); ,看下面汇编代码11:,12:,13:处。一样的代码:
mov ecx,dword ptr [ebp-4]
call @ILT+5(A::f) (0040100a)

可以简单理解为即使用(*this).f() 方式,在底层最终还是和this->f()的实现方式一样。那么this调用成员函数时的确不用多此一举的以*this方式调用。


9: void g()
10: {
00401690 push ebp
00401691 mov ebp,esp
00401693 sub esp,44h
00401696 push ebx
00401697 push esi
00401698 push edi
00401699 push ecx
0040169A lea edi,[ebp-44h]
0040169D mov ecx,11h
004016A2 mov eax,0CCCCCCCCh
004016A7 rep stos dword ptr [edi]
004016A9 pop ecx
004016AA mov dword ptr [ebp-4],ecx
11: f();
004016AD mov ecx,dword ptr [ebp-4]
004016B0 call @ILT+5(A::f) (0040100a)
12: (*this).f();
004016B5 mov ecx,dword ptr [ebp-4]
004016B8 call @ILT+5(A::f) (0040100a)
13: this->f();
004016BD mov ecx,dword ptr [ebp-4]
004016C0 call @ILT+5(A::f) (0040100a)
14: }
004016C5 pop edi
004016C6 pop esi
004016C7 pop ebx
004016C8 add esp,44h
004016CB cmp ebp,esp
004016CD call __chkesp (00420da0)
004016D2 mov esp,ebp
004016D4 pop ebp
004016D5 ret


再次感谢,两位贴汇编代码的朋友,感谢几位星星,感谢。。。。。。
fairuyy 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 richard4143 的回复:]
不懂,帮顶
[/Quote]

..............+|
richard4143 2010-05-18
  • 打赏
  • 举报
回复
不懂,帮顶
蜥蜴枪王 2010-05-18
  • 打赏
  • 举报
回复
C++中类的成员函数(static成员函数除外)都包含有一个隐藏的指针称为this指针,它指向调用该函数的对象的地址...不知道对LZ理解有没有帮助...
郑大钱 2010-05-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangweiit 的回复:]
虽然(*this).someMethod()与this->someMethod()效果一样
但是,我觉得,应该是this->someMethod()
[/Quote]

就是这个了啊!
starboy520 2010-05-17
  • 打赏
  • 举报
回复
我记得inside c++ object model 有这个的。呵呵
patricxuqi 2010-05-17
  • 打赏
  • 举报
回复
以下是关于static成员函数调用的反汇编代码

#include <iostream>
using namespace std;
class CTest
{
public:
static void sfun();
void nsfun();
private:
int a;
};

void CTest::sfun()
{
cout<<"in static fun"<<endl;
}
void CTest::nsfun()
{
a = 2;
cout<<"in nonstatic fun"<<endl;
}
void main()
{
CTest test1;
test1.nsfun();
CTest::sfun();
test1.sfun();

CTest test2;
test2.nsfun();
}


void main()
{
004115D0 push ebp
004115D1 mov ebp,esp
004115D3 sub esp,0D8h
004115D9 push ebx
004115DA push esi
004115DB push edi
004115DC lea edi,[ebp-0D8h]
004115E2 mov ecx,36h
004115E7 mov eax,0CCCCCCCCh
004115EC rep stos dword ptr es:[edi]
CTest test1;
test1.nsfun();
004115EE lea ecx,[test1]
004115F1 call CTest::nsfun (4111C7h)
CTest::sfun();
004115F6 call CTest::sfun (41111Dh)
test1.sfun();
004115FB call CTest::sfun (41111Dh) ;两种调用静态成员函数的地址是相同的。

CTest test2;
test2.nsfun();
00411600 lea ecx,[test2]
00411603 call CTest::nsfun (4111C7h) ;虽然函数地址与004115F1相同,但是ecx
;即this不同。说明非静态成员函数与静态成员函数的差别就在于调用是是否隐式地传入了this。
}
...;省略若干行
风吹肚凉 2010-05-17
  • 打赏
  • 举报
回复
this 调用成员函数会否默认调用*this?

...除了this传参,成员函数的调用跟class没有半毛钱关系...
SimonYeung 2010-05-17
  • 打赏
  • 举报
回复
this->XXX
tbnytbf 2010-05-17
  • 打赏
  • 举报
回复
唉,C和C++都快忘的差不多了,学习一下
走好每一步 2010-05-17
  • 打赏
  • 举报
回复
不要迷恋星星,呵呵,有道理。
kingstarer 2010-05-17
  • 打赏
  • 举报
回复
当然不会
当成员函数是重载的虚函数时
(*this).成员函数 调用的是静态类型的成员函数
this->成员函数和成员函数 调用的是动态类型成员函数
JYeung 2010-05-17
  • 打赏
  • 举报
回复
基本上,我认为不管是 this->f() 还是 (*this).f()
在编译器眼里都是f(this)
one2zero 2010-05-17
  • 打赏
  • 举报
回复
我倒是认为 *this 会转化为 this->

可以想象 *this 对应的内存块,this 对应的该内存块的头部

每次 *this 时 都会从头部去识别

————————————————————————————
以上纯属个人臆测,贻笑大方了
patricxuqi 2010-05-17
  • 打赏
  • 举报
回复
顶30楼,我也倾向与用汇编解决问题。
眼睛猥琐男 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 lnuyasha_hrb 的回复:]
主要看这2句
00881623 mov ecx,dword ptr [this]
00881626 call A::f (881005h)
上面在汇编代码段中没有变色。。。


希望对你能有帮助
[/Quote]

非常感谢。A::f不知道是否可以理解为(*this)::f。能的话,那么应该可以认为this调用成员函数时,默认*this方式。不知道对不对。
greenmemo 2010-05-17
  • 打赏
  • 举报
回复
返回引用

Type & Type::Function(...)
{

return *this;
}
加载更多回复(31)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧