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);
两个问题:
答案 0 :(得分:6)
f
DoSomething
的本地参考将超出范围,但这显然没有后果。
f
的main
对象仅在main
结束后才会超出范围(顺便提一下,应该 { {1}} int
。
总而言之,引用是对象的别名,但原始对象保留其范围,就像指针一样。
一个常见的建议是尽可能使用引用,指示何时。
一般来说,每当我需要传递参数时,我都会使用引用 - duh - 用于参考,以及指针,例如当我希望该参数是可选的 1 (指针可以是main
)时,当我接受数组时,......而且一般来说,我会说,当在函数中时我将使用指针作为指针,而不是一直取消引用它。
NULL
能力参数更好。答案 1 :(得分:3)
f
不会超出范围,因为它是函数的参数,即它不是在函数内部创建的。
如果可能,最好采用引用,因为它保证是有效的引用而不是null(是的,如果你使用一些技巧并调用未定义的行为,它可以为null,但是你的程序无论如何都无效。)
答案 2 :(得分:1)
Scope是一个编译时概念,而不是运行时概念。它指的是名称的可见性,而不是对象的生命周期。
你有三件名为f
的东西。其中一个是main
的本地人;其他人分别是DoSomething
和DoSomething2
的本地人。对于前两个,范围(名称,而不是对象)延伸到结束}
。
在f
中定义的名为main
的对象的生存期一直延续到main
返回。这是您向我们展示的代码中唯一的File
对象。
(除非你使用独立(即嵌入式)实现,否则它是int main()
,而不是void main()
。向任何教导你void main()
是正确的人投诉。)
答案 3 :(得分:0)
当然不是,f
的范围是函数main
。当main
返回时(即程序退出时),它将被销毁。
关于你的第二个问题,引用总是更好(在这里插入一些盐),保证你永远不会得到null
并且语法更清晰(意见,我知道)。< / p>
答案 4 :(得分:0)
当你调用“DoSomething”函数时,do something函数会引用从main调用的f。这意味着main中f的范围是从main的开头到结尾定义的。 “f.process”本质上不会超出范围。它保持在main中定义的范围。
答案 5 :(得分:0)
问题1: 您正在传递文件的地址并给它命名为f(其范围只是函数DoSomething(&amp; f)。调用File对象的成员函数永远不会影响f变量的范围。
排序答案=否。
问题2: 我理解的引用是一个Java概念,在C ++中通过“引用”传递是通过发送一个对象指针作为参数来完成的。是否通过指针传递最佳解决方案在很大程度上取决于您正在做的事情的背景。
排序答案=也许?