可能重复: What are the differences between pointer variable and reference variable in C++? How to pass objects to functions in C++?
我正在学习参考参数并得到以下问题:
这有什么区别:
void B(int* worthRef) {
*worthRef += 1;
}
int main() {
int netWorth = 55;
B(&netWorth);
return 0;
}
而且:
void B(int &worthRef) {
worthRef += 1;
}
int main() {
int netWorth = 55;
B(netWorth);
return 0;
}
答案 0 :(得分:5)
第一个(int *
)按值传递指向整数的指针;第二个(int &
)通过引用传递整数。这两种方法都可以用来实现抽象"引用语义",但在C ++中你应该尽可能使用实际的引用。
当您使用指针实现引用语义时,您将值指针传递给您要引用的对象,并且取消引用指针以获取实际对象参考。在C语言中,没有语言参考,这是实现引用语义的唯一方法,但在C ++中,为此目的,您在语言中有实际的引用类型。
请注意,传递指针可以与引用稍微不同,因为您可以传递空指针以传达其他语义,并且您还可以修改指针变量(例如,使用指针的本地副本)用于遍历数组的被调用者范围。)
但简而言之: 使用引用。不要在C ++中使用裸指针。(为了实现引用语义,你使用引用,并实现其他任何裸指针可以(ab)使用的,使用适当的更高级别的习语。)裸指针的基本问题是它们没有传达所有权语义,而C ++有许多更好的工具来编写可维护的,本地的和自我记录的代码。
答案 1 :(得分:1)
这里传递int的地址:
void B(int* worthRef) {
*worthRef += 1;
}
参数是指针。传递的地址可能是0
(或NULL
)。也用在C.指针可能会在B
:++worthRef
内改变 - 为什么你更喜欢......
这里,实现采用参数的地址:
void B(int &worthRef) {
worthRef += 1;
}
该参数是C ++参考。传递的地址不能是0
,也不能更改(当然,如果不是const,它所引用的内容可能会被更改,如您的示例所示)。这是大多数 C ++圈子中的默认书写样式。从机制上来说,引用是一些语法糖,但它传达意图和提供保证是绝对有用的。
在风格上,有些人更喜欢前者用于可能会发生变异的参数。我尽可能使用后者(和合法的) - 对C ++来说更常规。