返回对局部变量的引用

时间:2011-07-14 05:59:02

标签: c++ compiler-construction pass-by-reference

  

可能重复:
  Can a local variable's memory be accessed outside its scope?!

这是一段代码:

    #include <iostream>
using namespace std;

double &GetSomeData()
{
double h = 46.50;
double &hRef = h;
return hRef;
}

int main()
{
double nonRef = GetSomeData();
double &ref = GetSomeData();
cout << "nonRef: " << nonRef << endl;
cout << "ref: " << ref << endl;
return 0;
}

将nonRef打印为46.5 裁判不行。

第一个输出行为是正确还是刚运气?

由于

3 个答案:

答案 0 :(得分:10)

是的,你很幸运。

返回对局部变量的引用是未定义的行为。 未定义的行为意味着任何事情都可能发生,并且无法定义行为。

关于未定义的行为,

C ++标准第1.3.24节声明:

  

允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文件化方式行事,终止翻译或执行(发布诊断信息)。

答案 1 :(得分:0)

通常使用*来声明指针变量,并在指令后将指针取消引用回原始变量。 &安培;从变量

返回地址

我没有测试过这个,但是下面的工作做得更好吗?

#include <iostream>
using namespace std;

double* GetSomeData()
{
  double h = 46.50;
  return &h;
}

int main()
{
  double nonRef = GetSomeData();
  double* ref = GetSomeData();
  cout << "nonRef: " << nonRef << endl;
  cout << "ref: " << *ref << endl;
  return 0;
}

答案 2 :(得分:0)

如果您只是测试这两行之间的差异:

double nonRef = GetSomeData();
double &ref = GetSomeData();

尝试上课。

class test
{
public:
    int x;
    int& getx()
    {
        return x;
    }
};

//Some code
test c;
int nonRef = c.getx();
int &ref = c.getx();

ref = 8;
nonref = c.getx();

在此之后,c.getx()返回8.