当函数返回时,变量是否会超出范围

Will a variable go out of scope when the function returns?

本文关键字:范围 是否 变量 函数 返回      更新时间:2023-10-16
void main()
{
    File f;
    DoSomething(f);
    DoSomething2(&f);
}
void DoSomething(File& f)
{
    f.Process();
} // will f go out of scope when this function returns?
void DoSomething2(File* f);

两个问题:

  1. 如注释所示,当函数返回时,f会超出范围吗?
  2. 你建议使用引用或指针编写函数吗?(我说的是私人功能(
  1. f DoSomething的本地引用将超出范围,但这显然没有任何后果。

    main本地f对象仅在main结束后才超出范围(顺便说一下,这应该int main

    总而言之,引用是对象的别名,但原始对象保留其范围,就像指针一样。

  2. 一个常见的建议是尽可能使用引用,必要时使用指针

    通常,每当我需要传递参数 - duh - 作为参考时,我都会使用引用,以及指针,例如,当我希望该参数是可选的1(指针可以是NULL(,当我接受数组时,...一般来说,我会说,在函数中,我将使用指针作为指针,而不是一直取消引用它。

<小时 />
  1. 尽管在许多情况下,重载和默认值可能优于 NULL able 参数。

f不会超出范围,因为它是函数的参数,即它不是在函数内部创建的。

如果可能的话,最好采用引用,因为它保证是一个有效的引用而不是 null(是的,如果你使用一些技巧并调用未定义的行为,它可以是 null,但无论如何你的程序都是无效的(。

作用域是一个编译时概念,而不是运行时概念。 它指的是名称的可见性,而不是对象的生存期。

您有三件事名为f。 其中一个是main本地的;其他分别是DoSomethingDoSomething2的本地。 对于前两个,范围(名称,而不是对象(扩展到结束}

main 中定义的名为 f 的对象的生存期将一直持续到main返回。 这是您向我们展示的代码中唯一的File对象。

(

除非你使用的是独立(即嵌入式(实现,否则它是int main()的,而不是void main()的。 向任何教你的人或任何事抱怨void main()是正确的。

当然不是,f的作用域是函数main。当main返回时(即当您的程序退出时(,它将被销毁。

至于你的第二个问题,参考文献总是更好(在这里插入盐粒(,你保证你永远不会得到null,语法更干净(意见,我知道(。

当你调用你的"DoSomething"函数时,do something函数会引用从main调用的f。这意味着 main 中 f 的范围是从 main 的开始到结束定义的。从本质上讲,"f.process"并没有超出范围。它停留在 main 中定义的范围内。

问题 1:你正在传递一个文件的地址并给它命名f(其范围只是函数DoSomething(&f(。调用 File 对象的成员函数永远不会影响 f 变量的作用域。

排序答案 = 否。

问题2:根据我的理解,引用是一个 Java 概念,C++中的"引用"传递是通过发送对象指针作为参数来完成的。是否经过指针是最佳解决方案,很大程度上取决于您正在执行的操作的上下文。

排序答案 = 也许?