当函数返回时,变量是否会超出范围
Will a variable go out of scope when the function returns?
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);
两个问题:
- 如注释所示,当函数返回时,f会超出范围吗?
- 你建议使用引用或指针编写函数吗?(我说的是私人功能(
-
f
DoSomething
的本地引用将超出范围,但这显然没有任何后果。main
本地的f
对象仅在main
结束后才超出范围(顺便说一下,这应该int
main
。总而言之,引用是对象的别名,但原始对象保留其范围,就像指针一样。
-
一个常见的建议是尽可能使用引用,必要时使用指针。
通常,每当我需要传递参数 - duh - 作为参考时,我都会使用引用,以及指针,例如,当我希望该参数是可选的1(指针可以是
NULL
(,当我接受数组时,...一般来说,我会说,在函数中,我将使用指针作为指针,而不是一直取消引用它。
- 尽管在许多情况下,重载和默认值可能优于
NULL
able 参数。
f
不会超出范围,因为它是函数的参数,即它不是在函数内部创建的。
如果可能的话,最好采用引用,因为它保证是一个有效的引用而不是 null(是的,如果你使用一些技巧并调用未定义的行为,它可以是 null,但无论如何你的程序都是无效的(。
作用域是一个编译时概念,而不是运行时概念。 它指的是名称的可见性,而不是对象的生存期。
您有三件事名为f
。 其中一个是main
本地的;其他分别是DoSomething
和DoSomething2
的本地。 对于前两个,范围(名称,而不是对象(扩展到结束}
。
在 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++中的"引用"传递是通过发送对象指针作为参数来完成的。是否经过指针是最佳解决方案,很大程度上取决于您正在执行的操作的上下文。
排序答案 = 也许?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 检查私有成员变量是否在一定范围内,如果没有调整
- 堆栈变量超出范围时是否解除分配?
- 即使在超出范围之后,我是否可以保留矢量数据
- 是否将命名空间范围文件本地 (.cpp) 常量放在匿名命名空间中
- 如何在c/c++中检查两个任意内存范围是否重叠
- 正在尝试确定转换后的范围是否为空
- 稳定时钟系统范围是否稳定?
- c ++ 是否有 STL 算法来检查范围是否严格排序
- typedef 中的模板实例化的范围是否有限
- 语句的嵌套范围是否严格合法
- 更改自动分配内存的范围是否会影响性能
- x86-64上检查指针范围是否跨越N字节对齐地址的最快方法
- 如何检查迭代器指定的范围是否有效
- 以一种漂亮的STL方式检查一个范围是否是另一个范围的子范围
- 使用async结束线程并超出其未来的范围是否安全?