是PHP和C ++的只有2位,我们需要小心看起来像传递按值确实传递通过引用?

StackOverflow https://stackoverflow.com/questions/937585

是PHP和C ++的唯一2米的地方,我们需要小心通过一个简单的数据类型的变量作为函数参数和值可以改变?

$count = 2;
foo($count);
echo $count;

和所述第三线,回声$计数显示大于2以外的东西只知道PHP和C ++,其中它可以发生的。是否有任何其他地方,它可以发生?

<强>更新即,看起来像“按值传递”实际上是“按引用传递”。如果传递的Java,Perl中,PHP,Python和Ruby对象,它被自动传递按引用和实例变量对象的值可以改变。有关传递在非对象是什么?

有帮助吗?

解决方案

许多其他语言支持,例如 “按引用传递” - 的Perl,FORTRAN,帕斯卡时,Visual Basic,...

您关心哪几个一下,嗯,这是我们很难说 - !)

编辑: 在你的更新,你把Java和Python在同一类别,但这是错的:

:你不能用(JAVA)复制你的榜样
  int count = 2;
  whatever(count);
  /* count here is CERTAIN to be still 2 */

或(Python)的:

count = 2
whatever(count)
# count here is CERTAIN to be still 2

Python和Java的风格有时也被称为“通过对象引用”(与“通过可变参考”):什么是通过(或分配)是到对象(因此,如果该对象具有增变器的被叫方可以调用参考这些增变器,从而改变的对象),而不是一个“可变的”(使得该呼叫的可变后,如果有的话,用于传递参数,仍是指同一个对象,从未到另一对象)。这种区别是最清楚地看到与不可变的对象,如(Java和Python)的数字和字符串。

其他提示

可以不改变在C ++可变除非您明确地将其定义作为参考。如果你有定期的(非基准)的参数,它们是副本,可以不可以来改变。 如果你阅读和理解的API,那么就没有必要要的小心传递一个简单数据类型变量作为函数的参数的。

void func(type & arg);

可以被改变和

void func(type arg);

不能。并且通常在C ++中它不会除非API希望是在第一位置(输出参数)要被改变的值是一个参考的参数。

和亚历克斯已经提到的存在支持许多语言的通过引用传递成语。

您只需要如果语言使得它不小心清除如果一个变量传递的的值的或引用

回到在过去,FORTRAN通过引用传递常数。你可以通过不断的2到子程序和子程序可以分配3给它。然后返回后,该代码

x = 2 + 2

将设置X到6我不知道现代Fortran编译器允许这种情况发生。

按照上面的讨论,近日笔者了解到,ÿ编程语言设计使用的术语“传递按引用”是相当非常严格,例如在Java中其实只是通过按值,严格把关。

无论哪种,传递一个原语由值(明确大家我应该),或者通过值传递到一个对象的引用。好吧,我明白,现在还没有考虑下面的Perl代码。

sub addFoo {
  my ($arrayRef) = @_;
  push @{$arrayRef},"foo"; 
}

my @array = (1,2,3);
my $arrayRef; # FUTURE reference (equivalent to pointer C) to @array.

addFoo($arrayref = \@array); #1.
addFoo(\@array); #2.
addFoo($arrayRef); #3.

print join(" ",@array),"\n"; # result "1 2 3 foo foo foo\n";

我的问题,如果其中的三个替代调用addFoo,被认为是通按引用,而不是通过-A-引用?看来,答案是明确的三个数字,但我不能为数字#1说。 #2。因为在做完全一样的。至少,2是明确为传递通过引用在一些Perl手册页和Web站点考虑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top