C++ 当作用域变为空时,如何通过引用返回变量

C++ 当作用域变为空时,如何通过引用返回变量,c++,pass-by-reference,memory-address,C++,Pass By Reference,Memory Address,当返回函数的作用域已经消失,并且它的变量已经在返回变量时被销毁时,我们如何通过引用返回变量 如果我们采取以下措施来避免: int fr = 9; int& foo() { //const int& k = 5; return fr; }; 我会问,我们必须将返回的变量声明为全局变量吗?您可以返回函数本地静态变量,而不是全局变量,当然: int& foo() { static int rc = 9; return rc; } 但是,请注意

当返回函数的作用域已经消失,并且它的变量已经在返回变量时被销毁时,我们如何通过引用返回变量

如果我们采取以下措施来避免:

int fr = 9;
int& foo() {
    //const int& k = 5;
    return fr;
};
我会问,我们必须将返回的变量声明为全局变量吗?

您可以返回函数本地
静态
变量,而不是全局变量,当然:

int& foo() {
    static int rc = 9;
    return rc;
}

但是,请注意,您仍然有效地拥有一个全局变量及其所有问题,例如,来自多个线程的潜在并发访问。至少,从C++11开始,函数local
static
变量的初始化是线程安全的:函数local
static
变量在第一次执行声明语句时初始化。

使用static关键字,以便其作用域在整个代码中保持不变。 例如:-

  int& fun(){
  static int a =5;
  return a;
  }

 int main()
 {
  int &b=fun();
  cout<<b;
 }
int&fun(){
静态int a=5;
返回a;
}
int main()
{
int&b=fun();

cout您可以创建一个类并引入一个作为引用返回的成员。这将比“静态函数成员”解决方案更透明,但需要更多的开销,因此只有在您仍然需要一个类的情况下,这才是合理的

class Foo {
public:
   Foo() ;
   int& getFoo() {return myFoo;} 
private:
   int myFoo;
};
注意:OP和其他答案建议返回预先存在的对象(全局,
静态
,函数中,成员变量)。但是,这个答案讨论了返回一个生命周期从函数开始的变量,我认为这是问题的核心,即:

当返回函数的作用域已经消失,并且它的变量在返回变量后就被销毁时,我们如何通过引用返回变量呢

通过引用返回新对象的唯一方法是动态分配它:

int& foo() {
    return *(new int);
}
然后,稍后:

delete &myref;
当然,这不是通常的处理方法,也不是人们在看到返回引用的函数时所期望的

如果有一个对象,稍后调用“<代码>删除这个< /C>”,这可能是有意义的。同样,这也不是典型的C++。关于.< /p>的更多信息。 相反,当您想要返回在函数内部构造的对象时,通常要做的是:

  • 按值返回(可能利用)
  • 返回动态分配的对象(返回指向该对象的原始指针或包装该对象的类,例如智能指针)

但这两种方法都不是通过引用返回实际对象。

我假设这是一个研究原则的学术示例,因为编写原则的明显方法是通过值返回


考虑到这个前提条件,这看起来像是智能指针的一个用例。您可以将变量包装在智能指针中并按值返回。这类似于@Acorns answer,但变量一旦不再被引用,就会自动删除,因此无需显式删除。

这非常有趣。感谢Lotinesting Approvach,但有陷阱。每次调用该函数时,都会得到一个新的分配。用户必须自己删除该分配。不过,很好,你自己指出了这一点。@tangoal:你是什么意思?问题是从一个作用域已消失的函数返回对变量的引用。其他3个答案是关于返回pre的变体-现有对象(与函数的作用域不同——如果它们回答OP的特定问题,则有争议)。唯一的其他选择是此对象(返回新对象)--你必须通过一个动态内存区来完成,因为OP要求返回一个引用。@Acorn:听着,我没有否决你的答案。正如我所说的,这很有趣,而且与原始问题相符。我只是想指出,你的建议会导致内存泄漏,因为函数foo()的用户需要知道它需要再次删除内存。这并不明显,因为它返回的是引用而不是指针。但是,感谢您的帖子,我不知道这个选项。@tangoal:不用担心!答案不是试图提供如何正确设计接口,而是回答给定的问题(然后警告读者以防万一:-)否决票可能来自坚信StackOverflow应该是关于“良好/流行实践手册”的人,而不是事实。不确定“需要更多开销”是什么意思——这与OP的全局变量方法基本相同(或
静态
方法)。换句话说,函数返回对某个已分配的预先存在的对象的引用(由于函数结束,引用变量的范围未消失)@Acorn:我不知道线程开启器的总体目标。对于一个非常短的程序来说,设计类可能会增加开销,这就是我的意思。在这里设计类不会给我们带来任何好处——问题会转移到其他地方(例如,类的分配地).别误会我的意思:返回对成员的引用实际上非常常见,也没什么好惊讶的,但是原始变量的范围并没有消失(我觉得问题是关于这个)。