cout << (int)a;//C语言里,对这句的处理相当于下面.
fld DWORD PTR _a$[ebp]//将a对应数据存入浮点数栈
call __ftol//调用ftol()函数,将a转换成long型(long int都占32位.)
push eax//将转化后的long型数入栈
……//下面省去了,是调用cout对象的“<<”方法
cout << (int&)a;//这句的解释如下
mov eax, DWORD PTR _a$[ebp]//将a的数据调入寄存器
push eax//a的数据压入栈,以便调用输出。
所以(int)a,是强制转换为int型,中间要调用转换函数。
(int &)a,是强制转换为int型的引用,也就是直接引用其内存。
a内存数的表示为:0x3f800000,即1065353216,表示浮点数0.1(为什么0x3f800000,表示0.1,你可以参考一下IEEE754的说明.)
b内存数的表示为:0x00000000.
剩下的你自己理解吧.
//第二个文件,我帮你改了一下,可以了
#include
using namespace std;
class abc{ //这里你的类要先定义,后面的成员才有意义。
public:
abc(){
printf("abc\r\n");
}
~abc(){
printf("~abc\r\n");
}
};
void del(abc *pobj){
delete pobj;
}
void main()//一些空格无法被识别,删掉后就可以了。
{
abc *pobj = new abc;
del(pobj);
return;
}
第一个问题:
因为浮点数在内存中的存放方式为:符号+小数部分+指数,cout<<(int&)b就是把b在内存中的二进制数以整数输出
第二个问题应该写成del写成delete,就可以输出了
(1)
(int&)a----等价于*(int*)a
(2)
少了return 0 ;
析构函数return时系统调用,你这个程序应该通不过编译的...
(int&)a表示“a”的地址,输出的是内存中的地址1065353216??
~abc是析构函数,当然不会输出啦,如果你没有用new动态申请内存的话,析构函数可有可无。
希望你明白了
因为加了“()”,就不是引用了,在析构函数里面写上输出语句才可以输出信息的,delete是正确的清理内存的语句,所以可以。
你用cout << (int)b << endl; 语句强制把b转换为整形了,你想,小数变为整数,不是0是什麽
析构函数里面用到delete,怎末能说delete里面含有析构函数呢。
cout << (int)b << endl;
cout << (int&)b << endl;//(int&)b为什么是0??
上面你认真分析看,cout << (int)b << endl; 这条语句是在前面,在执行cout << (int&)b << endl;之前就已经转换了啊
第一部分是从 http://silver6.itpub.net/post/7329/47986
找的
(int&)a == static_cast
(int)&a == reinterpret_cast
(int&)a 不经过转换, 直接得到a在内存单元的值
(int)a a在内存中的值转换成int类型
float类型在内存中存储的形式是 ,符号位 指数 尾数
由754标准:阶码采用增码(该数补码的反符号),尾数采用原码
所以1.0f 在内存中的形式为
0011 1111 1000 0000 0000 0000 0000 0000
所以输出的是 0x3f800000
0 在内存中的的存储形式
0000 0000 0000 0000 0000 0000 0000 0000
(int&)a 把a强制转换成整形引用类型
(int)&a 把a的地址强制转换成整型
不过最好不要(int)&a
这是我写的
class abc; //前向声明
void del(abc* pobj)
//到这里abc还只是一个不完全类型,只能以有限的方式使用
//故你在函数中的delete操作虽然成功,但却导致找不到析构函数
{..}
class abc{ ..}
解决方法
#include
class abc{
public:
abc(){
printf("abc\r\n");
}
~abc(){
printf("~abc\r\n");
}
};
void del(abc* pobj){
delete pobj;
}
int main()
{
abc *pobj = new abc;
del(pobj);
}