2014-01-20 170 views
0

让我先说。我知道标题怀疑我问了一个问题,这个问题在这里和互联网上多次被回答。我做了研究,但我找不到满意的答案。重新拨打电话与拨打电话

我的问题最终归结于此。为什么通过引用调用Java调用值和C++调用(何时使用指针)?

传递引用时需要考虑Java中的方法调用,而传递指针时要考虑使用C++中的方法调用。最后,在这两种情况下,我都可以对调用者进行更改。在这两种情况下,我都将对象的地址传递给函数。实际上,我正在复制,即在传递指针时,也通过C++中的值进行调用。

您可以简单地通过运行下面的代码验证情况:

#include <iostream> 

void modify (int *i) { 
    int a = 5; 
    i = &a; 
} 

int main() { 
    int b; 
    int *i = &b; 
    std::cout << i << std::endl; 
    modify(i); 
    std::cout << i << std::endl; 
    return 0; 
} 

,它将打印相同的地址两次。

对我来说,仅仅通过引用属性来证明你可以用它做交换功能是不够的。我想知道通过引用引用通过引用调用的内容。

预先感谢您。

+0

“为什么是Java调用按价值计算,C++调用由引用(使用指针时)?”因为设计语言的人以这种方式指定了他们。 – twalberg

回答

1

我的问题最终归结于此。为什么通过引用调用Java调用值和C++调用(何时使用指针)?

C++真的是按值调用,而不是通过引用调用。在C++中看到的by-reference行为是您传递指针这一事实的副作用:指针本身是通过值复制的。你不能比较这些情况,因为Java没有指针。

+0

如果这是真的比互联网上的许多来源使用无效的术语... – ben

+0

@ user2820379通过值传递的指针可用于修改它指向的对象(但不是指针),就像当java通过通过值引用,它可以用来修改它引用的对象(但不是引用)。 – user3125280

+0

听起来对我来说非常直观。我只是困惑,因为C++通常被称为支持通过引用来调用。 – ben

0

您给出的示例是不恰当地使用通过引用的呼叫。在功能modify

void modify (int *i) { 
    int a = 5; 
    i = &a; 
} 

您声明一个局部变量a这是在栈上。当它超出范围时,它的地址是没有意义的。因此将a的地址分配给ii指向的内容没有影响。

那么通过引用调用的工作是什么,您可以修改函数中指向i的值。例如:

void modify (int *i) { 
    int a = 5; 
    *i = a; 
} 

因此在主函数中,你可以这样调用它:

int b = 2; 
int *i = &b; 
std::cout << *i << std::endl; //This will print 2 
modify(i); 
std::cout << *i << std::endl; //This will prints 5 
+0

你是绝对正确的。我给出的例子只是强调指针是按值传递的目的。 – ben