C++问题,高手请进!!
#include<iostream.h>voidmain(){floata=1.0f;cout<<(int)a<<endl;cout<<(int&)a<<endl;//(...
#include<iostream.h>
void main(){
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl; //(int&)a 是什么意思,为什么生成1065353216??
cout << "boolalpha:" << ( (int)a == (int&)a ) << endl;
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;//(int&)b为什么是0??
cout << "boolalpha:" << ( (int)b == (int&)b ) << endl;
}
#include<stdio.h>
class abc;
void del(abc* pobj){
delete pobj;
}
class abc{
public:
abc(){
printf("abc\r\n");
}
~abc(){
printf("~abc\r\n");
}
};
int main()
{
abc *pobj = new abc;
del(pobj);
}
为什么不输出~abc?
还是不明白,析构函数可以输出啊,为什么del写成delete,就可以输出了,还有(int&)a不是表示a的引用吗?
为什么(int&)a是1065353216,而(int&)b是0
大哥啊,我的理解是delete中是含有析构函数的,而析够函数里是有printf("~abc\r\n");的,另外我说的是(int&)b而不是(int)b 展开
void main(){
float a = 1.0f;
cout << (int)a << endl;
cout << (int&)a << endl; //(int&)a 是什么意思,为什么生成1065353216??
cout << "boolalpha:" << ( (int)a == (int&)a ) << endl;
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;//(int&)b为什么是0??
cout << "boolalpha:" << ( (int)b == (int&)b ) << endl;
}
#include<stdio.h>
class abc;
void del(abc* pobj){
delete pobj;
}
class abc{
public:
abc(){
printf("abc\r\n");
}
~abc(){
printf("~abc\r\n");
}
};
int main()
{
abc *pobj = new abc;
del(pobj);
}
为什么不输出~abc?
还是不明白,析构函数可以输出啊,为什么del写成delete,就可以输出了,还有(int&)a不是表示a的引用吗?
为什么(int&)a是1065353216,而(int&)b是0
大哥啊,我的理解是delete中是含有析构函数的,而析够函数里是有printf("~abc\r\n");的,另外我说的是(int&)b而不是(int)b 展开
5个回答
展开全部
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<iostream>
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;
}
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<iostream>
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,就可以输出了
因为浮点数在内存中的存放方式为:符号+小数部分+指数,cout<<(int&)b就是把b在内存中的二进制数以整数输出
第二个问题应该写成del写成delete,就可以输出了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
(1)
(int&)a----等价于*(int*)a
(2)
少了return 0 ;
析构函数return时系统调用,你这个程序应该通不过编译的...
(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;之前就已经转换了啊
~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)
(int)&a == reinterpret_cast<int>(&a);
(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<stdio.h>
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);
}
找的
(int&)a == static_cast<int&>(a)
(int)&a == reinterpret_cast<int>(&a);
(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<stdio.h>
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);
}
参考资料: http://silver6.itpub.net/post/7329/47986
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询