返回对象和范围

mfa*_*bel 4 c++ return function

我正在研究一个fraction类作为CS赋值,并编写了以下代码:

fraction fraction::add(fraction other) {
    fraction temp;

    /* manipulate temp */

    return temp;
}
Run Code Online (Sandbox Code Playgroud)

这完美地工作,创建一个新fraction对象,然后将其返回到调用代码.

问题是,为什么这有效?tempadd方法返回并因此被销毁时,我的分数应该超出范围,但是它会被传递回调用代码而不会出现错误.

为什么返回具有局部范围的东西会导致它在超出范围后继续存在?

Cro*_*man 6

你返回的是值temp,而不是temp对象本身.该值被复制并返回给调用函数,temp然后被破坏的事实与此无关.

就像这样:

int a;
{
    int b = 5;
    a = b;
}
std::cout << a << std::endl;
Run Code Online (Sandbox Code Playgroud)

关闭括号后,b已经超出范围,但a仍然包含值5,并且很好.函数调用大致发生了同样的事情.

如果你返回一个指向本地对象的指针,这是一个非常不同的故事.尝试取消引用该指针将调用未定义的行为,因为您正在尝试访问不再存在的对象.但是,当您只使用返回的值时,该对象是否存在并不重要,因为此时您只拥有自己包含的值的副本.(从技术上讲,它仍然按值返回,在这里,调用函数中的指针只包含自己的本地对象驻留地址的副本 - 你只是不能对它做任何有用的事情,因为它的生命周期以前驻留在该地址的对象已经结束.)