我习惯于在自己的代码中定期传递参数,但在阅读他人的 C++ 代码时经常偶然发现函数参数是通过引用或指针传递的。我不明白这样做的目的是什么。有人可以解释一下吗?
5 回答
这样做的原因主要有三个。
减少内存使用
每次调用函数时,参数都会被复制和传递。当您传递数字时,这没什么大不了的。但是,当您处理大块内存时,例如对象、结构、数组等,这将变得非常昂贵。
因此,所有复杂类型通常都作为指针传递。如果你在扔东西,你总是在使用指针。
在这种const
情况下应该使用限定符来指示变量不会被更改。
修改参数
有时修改传递的参数很有用,尽管这应该避免作为不好的风格。我认为最好的例子是修改一个数组,例如一个push()
函数。另一个是修改对象的公共成员,或者当您想从函数返回多个值时。
请注意,这可能是错误的来源。如果您正在修改传递的变量,那么从函数的名称中应该可以明显看出这就是您正在做的事情。
低级内存访问
任何直接与内存一起工作的东西都需要直接访问所述内存。C 中的标准实践,但在 C++ 中不太常见。查看类似的函数memcpy()
以及来自<string.h>
.
这样做的原因包括:
- 我需要修改一个不是被调用函数本地的变量。
- 我想将一个单词传递给函数,而不是复制一个大型结构或数组(如果我需要修改它可能还有另一个)。
- 它是指向共享内存的指针,我希望更改在不同的进程或线程中可见。
- 它是一个指向多态结构或联合(或 C++ 中的类)的指针,我希望该函数能够在运行时确定正确的类型。
- 数据的大小和类型可能会有所不同,例如
memcpy()
. - 该类型对客户端代码应该是不透明的。
- 这就是接口的指定方式。
如果将参数传递给函数,则可以在函数内部更改它。一旦该函数的执行完成,传入的变量将重命名不变。
int square_this_number(int x)
{
int y = 0;
y = x * x;
x = 1000;
return y;
}
int a = 10;
int b = 0;
b = square_this_number(a);
/* a is still 10, not 1000. */
/* b is 100. */
通过引用传递或通过指针传递意味着您希望在函数执行完成后保留更改。
int try_square_and_change_input(int& x)
{
int y = 0;
y = x * x;
x = 23;
return y;
}
int a = 5;
int b = 0;
b = try_square_and_change_input(a);
/* a is now 23 instead of just 5. */
/* b is 25 of course. */
您可以参考这个页面:https ://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/cplr233.htm
按值传递:当我们不想从被调用函数中更改变量值时。
通过引用传递:(仅。在 c++ 中,不在 c 中):当我们想通过调用函数对变量进行更改时。
通过指针传递:从 periferi 它的工作原理与参考相同,但存在差异..
如果我将一堆字符传递给一个函数,我可以在其中更改它们,并且在函数外部它们将保持不变。这意味着如果您希望将某些文本大写,您必须复制它,然后更改一些字母。
另一方面,如果您告诉函数该字符串在内存中的地址,则它可以更改现有字符串而无需复制。有时,所需的参数将消耗一个微不足道的大小。其他时候,所需的数据需要数百兆/千兆/兆字节。您要做的最后一件事是读入所有内容,然后制作一份您可以发送到函数的副本。
引用和指针之间的区别主要是对程序员来说很方便的语法,但这条规则也有重要的例外。