在给函数使用原始变量时,更好的做法是什么:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
or:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
勒夫:有什么理由选择一个而不是另一个吗?
在给函数使用原始变量时,更好的做法是什么:
unsigned long x = 4;
void func1(unsigned long& val) {
val = 5;
}
func1(x);
or:
void func2(unsigned long* val) {
*val = 5;
}
func2(&x);
勒夫:有什么理由选择一个而不是另一个吗?
当前回答
可以时使用引用,必要时使用指针。 来自c++常见问题:“什么时候应该使用引用,什么时候应该使用指针?”
其他回答
通过const引用传递,除非有原因你希望改变/保留你传递的内容。
在大多数情况下,这将是最有效的方法。
确保对不想更改的每个形参都使用const,因为这不仅可以防止您在函数中做一些愚蠢的事情,还可以很好地向其他用户指示函数对传入的值做了什么。这包括当你只想改变所指向的对象时,创建一个const指针…
引用是隐式指针。基本上,你可以改变引用指向的值,但你不能改变引用指向其他东西。因此,我的观点是,如果你只想改变一个参数的值,将其作为引用传递,但如果你需要改变参数以指向一个不同的对象,则使用指针传递它。
考虑一下c#的out关键字。编译器要求方法的调用者将out关键字应用于任何out参数,即使它已经知道它们是否存在。这是为了提高可读性。尽管在现代ide中,我倾向于认为这是语法(或语义)突出显示的工作。
指针:
可以被分配为nullptr(或NULL)。 在调用站点,如果你的类型本身不是指针,你必须使用&, 显式地修改对象。 指针可以被反弹。
引用:
不能为空。 一旦被束缚,就无法改变。 调用者不需要显式地使用&。有时这被认为是 不好,因为你必须去函数的实现看看 完成参数的修改。
引用类似于指针,除了不需要使用前缀*来访问引用所引用的值。同样,在初始化对象之后,不能引用另一个对象。
引用对于指定函数参数特别有用。
有关更多信息,请参阅“Bjarne Stroustrup”(2014)的“c++之旅”(A Tour of c++)第11-12页