C++类/对象调用时是怎么找到函数的?

cdwy411 2004-10-15 09:43:53
有如下一个测试程序:

class CTest
{
public:
long fromsubtype;
long tosubtype ;


CE2eRule(){}
~CE2eRule(){};

long print() {}

} ;
void main()
{
CTest test
cout<<sizeof(test)<<endl;
}

程序输出的结果为8 ,可见类中并没有什么东西记住函数,可是类或对象怎么找到函数

print()的呢?
...全文
498 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
星羽 2004-10-17
  • 打赏
  • 举报
回复
说反了,是函数找到对象,而非对象找到函数。
函数通过this指针确定当前所操作的是那个对象。
apogeecsj 2004-10-17
  • 打赏
  • 举报
回复
类的成员函数事实上在编译后都换了名字,如CTest类的print可能转换为:CTEST_@_print_long,
这样同普通C语言函数调用一样
elvahuang 2004-10-16
  • 打赏
  • 举报
回复
对象中当然不会存放函数的啊 函数是对每个对象都是有效的啦 否则 冗余

成员函数的定义会被编译成全局函数的 对象.成员函数会被编译成访问其对应的成员函数
Ji秋风 2004-10-16
  • 打赏
  • 举报
回复
long print() {}
等价于
long print(CTest *) {}
这样去理解应该没问题了吧。这就是this指针的一个作用。
greenteanet 2004-10-16
  • 打赏
  • 举报
回复
你可以看看<<高质量程序设计---C++/C语言>>(第二版)里面有很详细的说明.
umbrella1984 2004-10-15
  • 打赏
  • 举报
回复
调用对象的任何东西都会隐含传进一个this指针~
sharkhuang 2004-10-15
  • 打赏
  • 举报
回复
取个全局名字。就和c调用一样
Poville 2004-10-15
  • 打赏
  • 举报
回复
这是编译问题。
freefalcon 2004-10-15
  • 打赏
  • 举报
回复
你写这样的代码
CTest test;
test.print();

编译器在内部将转换为:(伪代码)
CTest test;
CTest_print( &test ); // CTest的print函数转换为:CTest_print( CTest* const this);

所以这就和普通函数调用差别不大了
晨星 2004-10-15
  • 打赏
  • 举报
回复
当在对象上调用一个成员函数,编译器受先根据对象的类型确认调用的是哪个函数,然后把这个对象的地址作为this指针传给那个函数。
晨星 2004-10-15
  • 打赏
  • 举报
回复
this指针是类的非静态成员函数的一个隐含参数。
晨星 2004-10-15
  • 打赏
  • 举报
回复
说反了,是函数找到对象,而非对象找到函数。
函数通过this指针确定当前所操作的是那个对象。
hhch2004 2004-10-15
  • 打赏
  • 举报
回复
这个程序输出对象test占用的内存,它用cout输出,不是用print()输出的
cablist 2004-10-15
  • 打赏
  • 举报
回复
在一个对象中只存放了成员变量
成员方法是通过调用执行的
cdwy411 2004-10-15
  • 打赏
  • 举报
回复
我就是想知道函数在内存里放在哪儿,站用多少内存,调用时怎么找到并执行的???
greenteanet 2004-10-15
  • 打赏
  • 举报
回复
在编译时,编译器会给每个函数一个名字(那是已经处理过的)正如 freefalcon说的。其实内部把函数的指针放到某一个数组里面,它占用了一定的内存,里面都是放成员函数的指针等,然后就可以从中调用函数了,可能我说的不是很清楚,大家见谅。有什么错误,请指正。
wangwencong 2004-10-15
  • 打赏
  • 举报
回复
当你如此是CTest x;时暗中定义一个this指针,指向x;当你调用CTest内部函数时,编译器暗中将this作为参数传入函数中。这样函数就知道具体处理的是那个对象了。

64,669

社区成员

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

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