标题:按值返回的临时量问题
只看楼主
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
 问题点数:0 回复次数:10 
按值返回的临时量问题

我在书上看到:
 通过传值返回,返回的结果是一个临时对象,因为它是临时的,自动被定为常量,是不可变的,也就是说临时对象的值是不可以改变的.


但下边的这个程序我发现临时对象的值是可以变化的.
我用的VC6.0,是编译器问题,还是书上说的有问题?

#include<iostream>
using namespace std;
class X
{
private:
int i;
public:
X(int ii=0);
void modify();
void display();
};

X::X(int ii)
{
i=ii;
}

void X::modify()
{
i++;
}

void X::display()
{
cout<<"i="<<i<<endl;
}

X f5()
{
return X();
}

const X f6()
{
return X();
}

void f7(X& x)
{
x.modify();
x.display();
}

int main()
{
f7(f5()); //即没有警告,也没有错误
return 0;
}

搜索更多相关主题的帖子: STRONG int void 对象 std 
2006-10-16 14:46
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
朋友,你的这个关于临时变量不可变的说法是在哪本书上看到的?

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-10-16 17:16
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
同问,呵呵。。。

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-10-16 17:30
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 

在Thinking in C++ Second Edition看到的

8.3.2中提到:
• 临时变量
有时候,在求表达式值期间,编译器必须建立临时对象。像其他任何对象一样,它们需要
存储空间而且必须被构造和删除。区别是我们从来看不到它们—编译器负责决定它们的去
留以及它们存在的细节。这里有一个关于临时变量的情况:它们自动地成为常量。因为我们
通常接触不到临时对象,不能使用与之相关的信息,所以告诉临时对象做一些改变几乎肯定
会出错。当程序员犯那样的错误时,由于使所有的临时变量自动地成为常量,编译器会向他
发出错误警告。


2006-10-16 19:54
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
得分:0 
In function `int main()':
46 invalid initialization of non-const reference of type 'X&' from a temporary of type 'X'
39 in passing argument 1 of `void f7(X&)'


我编译的结果

2006-10-16 21:17
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
woodhead,你用的是DEV吧,看来Thinking in C++ Second Edition说的应该是对的。

DEV似乎比VC更支持标准的C++

[此贴子已经被作者于2006-10-18 8:45:44编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-10-16 21:46
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
得分:0 
我不是郭靖,

you are right.



自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-10-18 06:18
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
得分:0 
这种临时变量对于build-in type(int, char, float....)而言是常量,使用一次后就进入常数区,下次定义数值相等的常数的时候很可能指向同样的地址(这个特性由编译器决定,不一定都这样)。如果这个临时变量是自己定义的类,那么他将在这行语句结束后自动销毁。
所以你看到的书上说的和你用的不一样。结果也相差很多。

http://myajax95./
2006-10-18 12:03
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
得分:0 
临时对象必须是常量
以前我提过
不清楚的
可以回到最前面
看看变量的定义
'临时变量'不符合变量的定义
所以是有const 的变量

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-10-18 14:49
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 
以下是引用myajax95在2006-10-18 12:03:09的发言:
这种临时变量对于build-in type(int, char, float....)而言是常量,使用一次后就进入常数区,下次定义数值相等的常数的时候很可能指向同样的地址(这个特性由编译器决定,不一定都这样)。如果这个临时变量是自己定义的类,那么他将在这行语句结束后自动销毁。
所以你看到的书上说的和你用的不一样。结果也相差很多。

这句话不怎么懂,你的意思是如果临时变量是自己定义的类,那么他就不再是常量了吗?


2006-10-18 19:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-96693-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.546503 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved