金庆的专栏
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
78 随笔 :: 0 文章 :: 231 评论 :: 0 Trackbacks
公告
欢迎订阅
上海程序员
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
(87)
1. C/C++(41)
(rss)
2. 网游开发(5)
(rss)
3. Python(16)
(rss)
4. Linux/Unix(3)
(rss)
5. 软工与管理(12)
(rss)
6. 其它(10)
(rss)
随笔档案
(78)
2008年11月 (4)
2008年10月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (3)
2008年6月 (4)
2008年5月 (6)
2008年4月 (7)
2008年3月 (6)
2008年1月 (5)
2007年12月 (7)
2007年11月 (4)
2007年10月 (5)
2007年9月 (6)
2007年8月 (8)
2007年7月 (5)
相册
公告照片
搜索
积分与排名
积分 - 73367
排名 - 28
最新评论
1. re: 批量html转text
你好,我需要这个程序代码,可以发给我一份吗?
不胜感谢,我的邮箱 lychenhanqing@163.com
--Hanqing Chen
2. re: Boost.Python构建与测试HOWTO
同意 ! 相当烂
--temp2
3. re: 万王之王3即将推出
不能
--xoyojank
4. re: log4cxx配合boost::format
评论内容较长,点击标题查看
--cui
5. re: STL容器的赋值运算符可以更灵活吗?
可以自己写一个static。话说,提供这样的东西很不安全。
--陈梓瀚(vczh)
阅读排行榜
1. VC6正在被抛弃(2812)
2. STL与标准库(1788)
3. 比较C++数组元素引用的两种形式a[0]与0[a](1697)
4. VS2005编译libevent(1691)
5. 用 (*it).m 还是 it->m(1637)
评论排行榜
1. VC6正在被抛弃(28)
2. "multiple definition of" 错误(18)
3. ACE与ASIO之间关于Socket编程的比较(16)
4. 把private声明从.h文件移到.cpp文件(13)
5. 用const方法更改非mutable成员(10)
60天内阅读排行
1. STL容器的赋值运算符可以更灵活吗?(1059)
2. log4cxx配合boost::format(1044)
3. pthread_rwlock使用错误(894)
4. Commons SCXML 中模型的类结构(795)
5. 万王之王3即将推出(46)
对临时变量的引用
以下代码来自《Imperfect C++》
#include
<
stdio.h
>
int
main()
{
long
l
=
2222
;
short
const
&
s
=
l;
l
=
0
;
printf(
"
%ld, %d\n
"
, l, s);
return
0
;
}
输出是0, 2222还是0, 0?
按C++标准,引用s所指向的不是l,而是一个临时变量,所以输出应该是0, 2222。
posted on 2008-01-10 11:36
金庆
阅读(711)
评论(9)
编辑
收藏
引用
所属分类:
1. C/C++
评论
#
re: 对临时变量的引用
2008-01-10 14:07
<a href=http://minidx.com>minidxer</a>
这个你要注意的应该是const,而不是引用
改成
short const s = l;
输出的结果同样应该是0, 2222
回复
更多评论
#
re: 对临时变量的引用
2008-01-10 14:17
<a href=http://minidx.com>minidxer</a>
另外金大虾如果可以对临时变量的生存周期做一下分析的话,那将会使很多人受益~
回复
更多评论
#
re: 对临时变量的引用
2008-01-10 14:48
金庆
@<a href=
http://minidx.com>minidxer</a>
对临时变量的引用必须是const
如short & s = l;就会编译报错。
该临时变量在其定义的作用域内有效。
回复
更多评论
#
re: 对临时变量的引用
2008-01-10 15:11
<a href=http://minidx.com>minidxer</a>
呵呵,
★这样呢?
int main()
{
long l = 2222;
short *s = (short *)&l;
l = 0;
printf("%ld, %d\n", l, *s);
return 0;
}
★或者这样呢?
int main()
{
long l = 2222;
const short *s = (short *)&l;
l = 0;
printf("%ld, %d\n", l, *s);
return 0;
}
★下面结论对吗?
●const与生命周期无关
●const引用与生命周期有关
●const的引用会改变临时变量的生命周期
★问题:
●程序员能不能操作临时变量?
●临时变量被释放有固定时间点吗?
●临时性对象被绑定reference,那又会有什么不同?
回复
更多评论
#
re: 对临时变量的引用
2008-01-11 10:07
金庆
@<a href=
http://minidx.com>minidxer</a>
minidxer想要引发我们对临时变量的思考。(或者是搅乱我们原来的认识?)
上述3个结论是正确的,只是第一个表述成这样更清晰:
const量与所赋值的生命周期无关
或者
const量与其他变量的生命周期无关
回答问题:
1. 无法操作临时变量
2. 临时变量会立即释放
3. 临时对量被引用后,不再临时
(再深入讨论可能会吓跑大批想学或正在学C++的朋友!)
回复
更多评论
#
re: 对临时变量的引用
2008-01-11 10:44
<a href=http://minidx.com>minidxer</a>
呵呵,只是想借这篇文章展开一下,平时可能很少会去认真思考这些问题,本来还想在深入一些,不过看来只能到此为止了。:)
const只是一个编译期的概念,其实很多相关的东西都是和编译器有关的。
另外,
●临时变量是可以操作的,包括延长该变量的生命周期
●临时变量的释放和编译器有关,不一定马上释放
回复
更多评论
#
re: 对临时变量的引用
2008-01-29 12:57
eXile
在这个例子中,s所引用的临时变量的生命期和s的生命期是一致的。
回复
更多评论
#
re: 对临时变量的引用[未登录]
2008-08-27 15:38
raof01
@<a href=
http://minidx.com>minidxer</a>
临时变量是可以操作的
如:
int main()
{
long l = 2222;
char const &s = l;
int *p = reinterpret_cast<int*>(const_cast<char *>(&s));
*p = 88;
printf("%ld, %c\n", l, s);
return 0;
}
回复
更多评论
#
re: 对临时变量的引用[未登录]
2008-08-27 15:39
raof01
能否操作临时变量,就看你有没有办法获取他的地址。
回复
更多评论
刷新评论列表
标题
姓名
主页
验证码
*
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
log4cxx配合boost::format
pthread_rwlock使用错误
STL容器的赋值运算符可以更灵活吗?
用bind来解耦
用const方法更改非mutable成员
"multiple definition of" 错误
VS2005编译libevent
Boost.Singals 教程
Boost.Python中文文档下载
修改Boost.date_time代码兼容VC6
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理
Powered by:
C++博客
Copyright © 金庆