在C ++中通过引用传递的两种方式?

时间:2012-02-05 19:33:37

标签: c++ pass-by-reference

  

可能重复:   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;
}

2 个答案:

答案 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 ++来说更常规。