021742
心要存高远,行才有信心!
C++博客
首页
新文章
联系
聚合
管理
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
猪头饼
阅读(955)
评论(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只是一个值没有分配内存所以不存在地址
下面也不对了
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
<
2006年2月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
C++(1)
其他
算法/数据结构(2)
随笔档案
2007年3月 (1)
2006年11月 (1)
2006年2月 (1)
搜索
积分与排名
积分 - 6992
排名 - 1367
最新评论
1. re: 一道算法面试题,大家讨论看看[未登录]
评论内容较长,点击标题查看
--汤
2. re: [讨论]临时对象有地址么?[未登录]
cout<<&(i+j)....错是因为i+j只是一个值没有分配内存所以不存在地址
下面也不对了
--塌塌方
3. re: 一道算法面试题,大家讨论看看
评论内容较长,点击标题查看
--塌塌方
4. re: 一道算法面试题,大家讨论看看
评论内容较长,点击标题查看
--猪头饼
5. re: 一道算法面试题,大家讨论看看
评论内容较长,点击标题查看
--BearBlog
阅读排行榜
1. 一道算法面试题,大家讨论看看(3597)
2. KMP算法资料(1451)
3. [讨论]临时对象有地址么?(955)
评论排行榜
1. 一道算法面试题,大家讨论看看(18)
2. [讨论]临时对象有地址么?(10)
3. KMP算法资料(0)