| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4453 人关注过本帖
标题:函数返回局部变量的引用或指针
只看楼主 加入收藏
zzt_428
Rank: 2
来 自:南京师范大学
等 级:论坛游民
威 望:2
帖 子:243
专家分:22
注 册:2008-7-6
收藏
 问题点数:0 回复次数:6 
函数返回局部变量的引用或指针
不是说函数不可以返回指向局部变量或临时变量的引用吗?  那么下面我这个代码为什么执行结果是对的,没有发现问题?

//---file1:mytime.h  Time类的声明
#ifndef MY_TIME_H_
#define MY_TIME_H_

class Time
{
public:
    Time();
    Time(int h, int m=0);
    void AddMin(int m);
    void AddHour(int h);
    void Reset(int h=0, int m=0);
    const Time &Sum(const Time &t) const;
    void Show() const;
private:
    int hours;
    int minutes;
};
#endif

//file2:mytime.cpp  类的实现
#include <iostream>
#include "mytime.h"


Time::Time()
{
    hours=minutes=0;
}

Time::Time(int h,int m)
{
    hours=h;
    minutes=m;
}

void Time::AddHour(int h)
{
    hours+=h;
}

void Time::AddMin(int m)
{
    minutes+=m;
    hours+=minutes/60;
    minutes%=60;
}

void Time::Reset(int h, int m)
{
    hours=h;
    minutes=m;
}

const Time &Time::Sum(const Time &t) const   // 这里的sum是局部变量,函数执行完毕,变量被销毁.我这里
{
    Time sum;                           //返回指向局部变量sum的引用,为什么编译没有出错啊?
    sum.minutes=minutes+t.minutes;
    sum.hours=hours+t.hours+sum.minutes/60;
    sum.minutes %= 60;

    return sum;

}

void Time::Show() const
{
    std::cout << hours << "hours" << minutes << "minutes";
}


//file3:usetime.cpp  

#include <iostream>
#include "mytime.h"

int main()
{
    using std::cout;
    using std::endl;

    Time planning;
    Time coding(2,40);
    Time fixing(5,55);
    Time total;

    cout << "planning time =";
    planning.Show();
    cout << endl;

    cout << "coding time=";
    coding.Show();
    cout << endl;

    cout << "fixing time=";
    fixing.Show();
    cout << endl;

    total=coding.Sum(fixing);
    cout << "coding.sum(fixing)=";
    total.Show();
    cout << endl;
    
    return 0;
}


执行结果是对了.
哪位能指教一下,感激不尽!
搜索更多相关主题的帖子: 变量 指针 函数 局部 
2008-08-26 12:19
p1s
Rank: 4
等 级:贵宾
威 望:10
帖 子:454
专家分:3
注 册:2005-11-4
收藏
得分:0 
我记得编译应该是不会出错的,因为语法都是正确的。问题在于局部变量是存储在Stack区的,如果返回的是指针或引用而恰好后面的函数修改了该Stack区的数据,那么下次你再使用这个指针或者引用的时候就会发生问题了。
2008-08-26 12:42
zzt_428
Rank: 2
来 自:南京师范大学
等 级:论坛游民
威 望:2
帖 子:243
专家分:22
注 册:2008-7-6
收藏
得分:0 
$$$$
编译确实可以通过啊,,但是书上明明写着,函数不可以返回临时变量或局部变量的引用的啊.
2008-08-26 14:12
sun389567475
Rank: 1
等 级:新手上路
帖 子:51
专家分:0
注 册:2008-8-18
收藏
得分:0 
这是返回值给引用。
跟:
const int &sum( void )
{
int s=10;
return s;
}
这个意思差不多
2008-08-27 10:30
zhuerhua
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-6-29
收藏
得分:0 
正如一楼所说,返回引用和指针是不会为返回结果生成新的变量,函数结束后那块区域被释放为公共的,后面可能改变可能不改变,如果你引用会造成潜在危险,这种危险比编译报错更可怕.所以文献都说不能返回局部变量的引用
2008-08-27 10:53
yulin11111111
Rank: 1
来 自:大连
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-8-27
收藏
得分:0 
我的编译器就不能通过 我用的是Dev-C++
我的编译器就不能通过 我用的是Dev-C++
2008-08-27 10:53
guji_1234
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-6-30
收藏
得分:0 
在返回的时候局部变量将它复制给另一在全局的变量,所以它本身是销毁了,可是他复制的并没有销毁,而你所问的是返回的是const int& 是说她是一个常引用,即返回值不能被改变而且是一个变量的别名,而此题sum是局部变量,不是什么局部变量的引用。类似于:
#include <iostream>
using namespace std;

const int& get(const int x ){
    int sum = x;
    sum++;
    return sum;
}


int main(){
    cout<<get(5)<<endl;
}

若你改变该函数,把sum变作引用,改写函数,则返回sum就报错了。
2008-08-27 13:23
快速回复:函数返回局部变量的引用或指针
数据加载中...
 
   



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

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