| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1132 人关注过本帖
标题:按值返回的临时量问题
取消只看楼主 加入收藏
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
 问题点数:0 回复次数:2 
按值返回的临时量问题

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


但下边的这个程序我发现临时对象的值是可以变化的.
我用的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
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
收藏
得分:0 

在Thinking in C++ Second Edition看到的

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


2006-10-16 19:54
我不是郭靖
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
快速回复:按值返回的临时量问题
数据加载中...
 
   



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

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