【问题标题】:Since a reference variable is an alias to another variable, how is it possible that we work with this scoped variable from another function?由于引用变量是另一个变量的别名,我们怎么可能从另一个函数中使用这个作用域变量呢?
【发布时间】:2021-04-30 11:54:42
【问题描述】:

既然引用变量是另一个变量的别名,我们怎么可能在另一个函数中使用引用。例如:

void func(int& a){
    a *= 4;
    return;
}

int main(){
    int n = 3;
    func(n);
    std::cout << n << std::endl; //displays 12
}

这里,变量 'n' 由 main 堆栈框架界定(对吗?)。那么,如何在函数func中使用(因为它的作用域内不存在)?

'n'是否会因为引用传递给另一个函数而被存储在堆中?

【问题讨论】:

  • 您可以从func 访问n,因为您明确提供了func 的引用。你能分享一下为什么你认为这不应该起作用吗?
  • 我不确定我是否理解。 a 是一个引用,或者是传递给函数的事物的别名。由于您将n 传递给函数,因此a 成为n 的别名。有什么让你感到困惑的?
  • 引用有时与别名相似,但它们实际上不仅仅是简单的别名。如您的代码所示。在您的示例中,func 中的引用变量 a 更像是一个指针,具有自动取消引用功能,并且在调用中编译器生成代码以将指针从 main 传递给 n
  • nmain 的末尾超出范围,因此在调用func 时它仍然是“活动的”
  • @Someprogrammerdude 该标准从字面上说明引用是别名。引用行为类似于指针的事实是编译器的实现细节。使用实际指针是编译器实现引用的最常见和最简单的方法,但这不是必需的。

标签: c++ function stack pass-by-reference heap-memory


【解决方案1】:

不要考虑范围,而是考虑内存位置。 当您在 func 中传递 n 作为引用时,认为编译器正在为同一内存位置创建一个新名称 a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-07
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多