设为首页 加入收藏

TOP

C++从零开始(十)――何谓类(二)
2014-11-24 13:20:08 】 浏览:10087
Tags:从零 开始 何谓
t( tem - tem / 10 );
}
void main()
{
ABC a, b, c; AB d;
( c.*( void ( ABC::* )( long ) )&AB::ABC )( 43 );
( b.*( void ( ABC::* )( long ) )&AB::ABCD )( 0XABCDEF12 );
( d.*( void ( AB::* )( short, short ) )ABC::AB )( 0XABCD, 0XEF12 );
}
上面执行后,c.a为0X00270004,b.a为0X0000EF12,d.a为0XABCD,d.b为0XFFFF。对于c的函数调用,由于AB::ABC映射的地址被直接转换类型进而直接被使用,因此程序将跳到AB::ABC处的a = short( tem / 10 );开始执行,而参数tem映射的是传递参数的内存的首地址,并进而用long类型解释而得到tem为43,然后执行。注意b = short( tem - tem / 10 );实际是this->b = short( tem - tem / 10 );,而this的值为c对应的地址,但在这里被认为是AB*类型(因为在函数AB::ABC的函数体内),所以才能this->b正常(ABC结构中没有b这个成员变量),而b的偏移为2,所以上句执行完后将结果39存放到c的地址加2所对应的内存,并且以short类型解释而得到的16位的二进制数存放。对于a = short( tem / 10 );也做同样事情,故最后得c.a的值为0X0027004(十进制39转成十六进制为0X27)。
同样,对于b的调用,程序将跳到AB::ABCD,但生成的b的调用代码时,将参数0XABCDEF12按照参数类型为long的格式记录在传递参数的内存中,然后跳到AB::ABCD。但编译AB::ABCD时又按照参数为两个short类型来映射参数tem1和tem2对应的地址,因此容易想到tem1的值将为0XEF12,tem2的值为0XABCD,但实际并非如此。参数如何传递由之前说的函数调用规则决定,函数调用的具体实现细节在《C++从零开始(十五)》中说明,这里只需了解到成员函数映射的仍然是地址,而它的类型决定了如何使用它,后面说明。


声明的含义

前面已经解释过声明是什么意思,在此由于成员函数的定义规则这种新的定义语法,必须重新考虑声明的意思。注意一点,前面将一个函数的定义放到main函数定义的前面就可以不用再声明那个函数了;同样如果定义了某个变量,就不用再声明那个变量了。这也就是说定义语句具有声明的功能,但上面成员函数的定义语句却不具有声明的功能,下面来了解声明的真正意思。
声明是要求编译器产生映射元素的语句。所谓的映射元素,就是前面介绍过的变量及函数,都只有3栏(或3个字段):类型栏、名字栏和地址栏(成员变量类型的这一栏就放偏移值)。即编译器每当看到声明语句,就生成一个映射元素,并且将对应的地址栏空着,然后留下一些信息以告诉连接器――此.obj文件(编译器编译源文件后生成的文件,对于VC是.obj文件)需要一些符号,将这些符号找到后再修改并完善此.obj文件,最后连接。
回想之前说过的符号的意思,它就是一字符串,用于编译器和连接器之间的通信。注意符号没有类型,因为连接器只是负责查找符号并完善(因为有些映射元素的地址栏还是空的)中间文件(对于VC就是.obj文件),不进行语法分析,也就没有什么类型。
定义是要求编译器填充前面声明没有书写的地址栏。也就是说某变量对应的地址,只有在其定义时才知道。因此实际的在栈上分配内存等工作都是由变量的定义完成的
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++从零开始(五)――何谓指针 下一篇C++从零开始(九)――何谓结构

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目