posts - 3,  comments - 28,  trackbacks - 0

 

class  A
{

private :
    
int  i;
public :
    A(
int  ii):i(ii) {} // cout<<i<<"  A() "<<endl;
    A():i( 0 ) {}

    
~ A() {cout << " ~A( " << i << " " << endl;}

    
const  A  operator   + ( const  A  & r)  const
    
{
        
return  A(i + r.i);

    }

}
;

int  main()
{
    
int  i = 10 ,j = 20 ;
    
// cout<<&(i+j)<<endl;           // 这里为什么会出错呢?
    A a1( 10 ),a2( 20 ),a3( 30 ),a4( 40 );
    cout
<<& (a1 + a2) << endl;        // 这里就应该是临时变量的地址了吧
    system( " pause " );
    
return   0 ;
}



既然这样可以运行,那为什么内置的类型如:int float之类的不能取临时对象的值呢?
我重载的+号运算符应该没有写错吧、、
请大家指教。。谢谢我还只是一个初学者

posted on 2006-02-12 22:12 猪头饼 阅读(950) 评论(10)  编辑 收藏 引用 所属分类: C++

FeedBack:
# re: [讨论]临时对象有地址么?
2006-02-13 00:05 | 音乐虫子
i+j得到的是一个值,不存在你说说的临时对象
  回复  更多评论
  
# re: [讨论]临时对象有地址么?
2006-02-13 00:19 | 梅阿查没有眼泪
谢谢你的回复
那么:
int foo()
{
return 10+20; //这个应该返回的是一个临时对象了吧
}
//下面为什么这里还是会出错呢?
cout<<&foo();
  回复  更多评论
  
# re: [讨论]临时对象有地址么?
2006-02-13 09:50 | 虫子
int是值类型,不是类类型  回复  更多评论
  
# re: [讨论]临时对象有地址么?
2006-02-13 11:07 | 小明
int foo()
{
return 10+20; //这个应该返回的是一个临时对象了吧
}


如果你懂一些汇编,vc中,这个函数返回的时候,只是把结果30放到EAX
mov eax ,30
并不生成一个临时对象
调用者也只是从EAX中取得这个值  回复  更多评论
  
# re: [讨论]临时对象有地址么?
2006-02-13 13:46 | 梅阿查没有眼泪
在C++中真正的临时对象是看不见的,它们不出现在你的源代码中。建立一个没有命名的非堆(non-heap)对象会产生临时对象。这种未命名的对象通常在2种条件下产生:
1:为了使函数成功调用而进行隐式类型转换
由于对于临时对象的概念还没有搞清楚,在些贻笑大方了

void foo(const int & i)
{
cout<<&i<<endl;
}

float f=3.14;
foo(f);//这里应该是正确的打印出这个临时对象的地址了吧。

2:函数返回对象时
int foo()
{
return 10+20; //这个是不是编译器对些做出的一些优化而没有产生临时对象呢
}

谢谢各位指导  回复  更多评论
  
# re: [讨论]临时对象有地址么?
2006-02-13 18:01 | hdqqq1
让编译器生成汇编就可以清楚了.  回复  更多评论
  
# re: [讨论]临时对象有地址么?
2006-02-22 02:27 | 挺c++
1.返回局部对象(你的A(i+r.i))时,编译器调用A的拷贝构造函数,又复制了一个A,因而得到了你所谓的临时对象.但是这样效率比较低.
2.你的那个函数foo()里面的常数加法10+20实际上是在编译期执行的.简单的返回值vc直接写到eax里面了.就是楼上仁兄说的mov eax,30就搞定.
3.你的原来那个式子里面,i+j这样的简单运算也是在寄存器中完成的. i+j会编译为:
mov eax, dword ptr [i]
add eax, dword ptr [j]
如果没有进一步的赋值语句,怎么获取地址?
实际上,如果一个语句就仅仅是:i+j;
那么编译器优化后根本不为这条语句生成任何代码.  回复  更多评论
  
# re: [讨论]临时对象有地址么?
2006-03-12 00:09 | amazement
对于取地址符号&在汇编中的实现是这样的:1,必须将该数压入到为程序分配的堆栈之中,如 push %eax. 2 然后通过对帧指针%ebp的定位,如leal 8(%ebp),%ebx(lea 为load effective address,8(%ebp)意思是将%ebp+8),那么现在%ebx中存储的就是该数值的地址了.
  回复  更多评论
  
# re: [讨论]临时对象有地址么?
2006-03-12 00:13 | amazement
对于取地址符号&在汇编中的实现是这样的:1,必须将该数压入到为程序分配的堆栈之中,如 push %eax. 2 然后通过对帧指针%ebp的定位,如leal 8(%ebp),%ebx(lea 为load effective address,8(%ebp)意思是将%ebp+8),那么现在%ebx中存储的就是该数值的地址了.按照程序的情况来看,对于那个 int 的临时变量没有压入堆栈.
  回复  更多评论
  
# re: [讨论]临时对象有地址么?[未登录]
2007-05-31 13:48 | 塌塌方
cout<<&(i+j)....错是因为i+j只是一个值没有分配内存所以不存在地址
下面也不对了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2007年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

  •  

积分与排名

  • 积分 - 6971
  • 排名 - 1368

最新评论

阅读排行榜

评论排行榜