社区
C++ 语言
帖子详情
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
打赏
收藏
C++类/对象调用时是怎么找到函数的?
有如下一个测试程序: class CTest { public: long fromsubtype; long tosubtype ; CE2eRule(){} ~CE2eRule(){}; long print() {} } ; void main() { CTest test cout<<sizeof(test)<<endl; } 程序输出的结果为8 ,可见类中并没有什么东西记住函数,可是类或对象怎么找到函数 print()的呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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作为参数传入函数中。这样函数就知道具体处理的是那个对象了。
c++
对象
调用
函数
的流程
日常学习中的发现:
C++
中
调用
虚成员
函数
的流程是:
调用
对象
obj中的vptr,获取指针指向的虚
函数
表,再通过位移操作
找到
虚
函数
表中特定
函数
的地址
调用
。这个obj必须被初始化,因为
调用
该
对象
内部的vptr的
时
候 发现为初始化是会报错的 `
c++
中
调用
非静态成员
函数
的流程是: 在编译
时
期,编译器就完成对
函数
代码的解析,并获取到相应的
函数
代码,再通过一定的命名规则(name mangling)保存。 所以
对象
在
调用
某成员
函数
的
时
候例如: obj.someone();的
时
候 首先通过someone 这个
函数
C++
函数
返回值为
对象
时
调用
复制构造
函数
的问题
C++
函数
返回值为
对象
时
调用
复制构造
函数
的问题 知识点:
C++
中
调用
复制构造
函数
的三种情况: 通过一个
对象
构造另一个
对象
调用
参数为
对象
的
函数
调用
返回值为
对象
的
函数
– 上述知识点在各种书籍、博客都无不同,属于
C++
的标准 – 但是实际测试的
时
候,当
调用
返回值为
对象
的
函数
时
,并未按预想地
调用
复制构造
函数
。 – 在查阅了很多博客资料后,原因如下: 当
调用
返回值为
对象
的
函数
时
,系统消耗调...
C++
关于参数是
对象
时
要
调用
拷贝构造
函数
进行传参的问题探讨
文章目录值传递(
调用
拷贝构造
函数
)地址传递(不
调用
拷贝,直接对原
对象
进行修改)注意:
调用
拷贝构造的三种情况相关问题:1 、
c++
,
类
的
对象
作为形参
时
一定会
调用
复制构造
函数
吗?2 、如果
类
中没有定义复制构造
函数
那
对象
就不能作为形参?
对象
也可以作为
函数
的参数传递给
函数
,其转递方法与传递其他
类
型的数据一样,可采用值传递和地址传递两种方法。 值传递(
调用
拷贝构造
函数
) 值传递:是把
对象
的拷贝而不是本身传递给
函数
,
函数
中对参数
对象
的任何修改都不会影响
调用
该
函数
的
对象
本身; 地址传递(不
调用
拷贝,直接对原
对象
进行修
c++
,
类
的
对象
作为形参
时
一定会
调用
复制构造
函数
吗?
c++
,
类
的
对象
作为形参
时
一定会
调用
复制构造
函数
吗?答:如果参数是引用传递,则不会
调用
任何构造
函数
;如果是按值传递,则
调用
复制构造
函数
,按参数的值构造一个临
时
对象
,这个临
时
对象
仅仅在
函数
执行是存在,
函数
执行结束之后
调用
析构
函数
。如果
类
中没有定义复制构造
函数
那
对象
就不能作为形参?答:如果没有定义,编译器会自动为你定义一个,编译器自己定义的复制构造
函数
是按
类
成员变量的值复制的。有几个成员变量就重新创...
C++
中const和非const
对象
分别
调用
const和非const成员
函数
一、先来提出问题 const
对象
可以
调用
非const成员
函数
吗? 非const
对象
可以
调用
const成员
函数
吗? const成员
函数
内可以
调用
其它的非const成员
函数
吗? 非const成员
函数
内可以
调用
其他的const成员
函数
吗? 二、实践出真知 实践发现: 1、const
对象
可以
调用
const成员
函数
2、const
对象
不能
调用
非const成员
函数
3、非const
对象
可以
调用
const成员
函数
4、非const
对象
可以
调用
非const成员
函数
5、const成员
函数
不能
调用
非const成员
函数
C++ 语言
64,669
社区成员
250,488
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章