Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 是PHP和C++;我们需要注意的只有两个地方看起来像是通过值传递,实际上是通过引用传递?_Function_Pass By Reference_Pass By Value - Fatal编程技术网

Function 是PHP和C++;我们需要注意的只有两个地方看起来像是通过值传递,实际上是通过引用传递?

Function 是PHP和C++;我们需要注意的只有两个地方看起来像是通过值传递,实际上是通过引用传递?,function,pass-by-reference,pass-by-value,Function,Pass By Reference,Pass By Value,是PHP和C++唯一的2个地方,我们需要小心地将简单的数据类型变量传递为函数参数,并且值可以被改变? 比如 $count = 2; foo($count); echo $count; 第三行echo$count显示的不是2。我只知道PHP和C++在哪里发生。还有其他地方会发生这种事吗 更新:也就是说,看起来像“按值传递”的实际上是“按引用传递”。如果它正在传递Java、Perl、PHP、Python和Ruby中的对象,它将自动通过引用传递,并且可以更改对象的实例变量值。那么传入非对象呢?许多其

是PHP和C++唯一的2个地方,我们需要小心地将简单的数据类型变量传递为函数参数,并且值可以被改变?

比如

$count = 2;
foo($count);
echo $count;
第三行echo$count显示的不是2。我只知道PHP和C++在哪里发生。还有其他地方会发生这种事吗


更新:也就是说,看起来像“按值传递”的实际上是“按引用传递”。如果它正在传递Java、Perl、PHP、Python和Ruby中的对象,它将自动通过引用传递,并且可以更改对象的实例变量值。那么传入非对象呢?

许多其他语言都支持这种“按引用传递”——Perl、Fortran、Pascal、Visual Basic

你关心的是什么,我们很难说!)

编辑: 在您的更新中,您将Java和Python放在同一个类别中,但这是错误的:您无法使用(Java)重现您的示例:

或(Python):


Python和Java的风格有时被称为“按对象引用”(与“按变量引用”相反):传递(或分配)的是对对象的引用(因此,如果对象具有变体,则被调用方可以调用这些变体,从而更改对象),而不是对“变量”的引用(因此,在调用之后,用于传递参数的变量(如果有)仍然引用同一个对象,而不是另一个对象)数字和字符串。

除非C++中的<强>显式< /强>,否则不能更改变量。将其定义为引用。如果有规则(非引用)参数,则它们是副本,可以<强> > < >强>。 如果您阅读并理解了API,那么在将简单的数据类型变量作为函数参数传递时就不需要太小心了

可以改变和

void func(type arg);

不能,通常在C++中它不会是引用参数,除非API希望的值首先被改变(输出参数)。 正如Alex已经提到的,有许多语言支持“通过引用传递”的习惯用法


如果一种语言不清楚变量是通过值还是通过引用传递的,您只需要小心。

在过去,FORTRAN是通过引用传递常量的。您可以将常量2传递给子例程,子例程可以为其指定3。然后在返回后,此代码

x = 2 + 2

将x设置为6。我不知道现代FORTRAN编译器是否允许这种情况发生。

经过上述讨论,最近我了解到y编程语言设计中术语“按引用传递”的使用非常严格,例如在java中实际上只是严格地按值传递

也可以传递一个基于值的原语(对我所假设的每个人都清楚),或者通过值传递一个对象的引用。

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的三个可选调用中,哪一个被认为是通过引用而不是通过引用?似乎数字3的答案很清楚,但我不能说数字1.#2。我们的做法完全相同。至少在一些perl手册页和web站点中,数字2被明确地视为通过引用es.

在Java和Python中,您不能将“Car”对象传递给函数,并在该函数中更改Car对象的“miliety”属性,以便在函数返回时更改miliety?是的,如果对象是可变的,您可以在被调用方中更改它——它仍然是相同的对象(相同的标识)但是,根据定义,一个可变对象是一个状态可以被改变(没有身份改变)的状态。这是一个非常明显的概念,从(例如)将一个不同的对象分配给某个变量。在这个C++示例中,调用函数“FUNC(x)”。无论是传递值还是传递引用,看起来都是一样的。正如lothar所说,您需要阅读和理解API——它是void func(type&arg)还是void func(type arg)?如果函数接受引用并且您需要按值传递,我想有一种方法可以调用复制构造函数——它是“func(type(x))”吗?
void func(type arg);
x = 2 + 2
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";