为什么或在什么情况下,您会在 C++ 中将参数作为引用(或指针)传递给函数?
Why, or in what situations, would you pass an argument to a function as a reference (or pointer) in C++?
我习惯于在自己的代码中定期传递参数,但在阅读其他人的 C++ 代码时经常偶然发现函数参数通过引用或指针传递。我不明白这样做的目的是什么。有人可以解释一下吗?
如果我将一堆字符传递给函数,我可以在函数内部更改它们,而在函数外部它们将保持不变。这意味着如果您想将某些文本大写,则必须复制它,然后更改其中的一些字母。
另一方面,如果您告诉函数该字符串在内存中的地址,则它可以更改现有字符串而无需复制。有时,所需的参数会占用很小的空间。其他时候,所需的数据需要数百 mega/giga/tera 字节。你最不想做的就是读入所有内容,然后复制一份你可以发送给一个函数。
引用和指针之间的区别主要是程序员的语法方便,但也有重要的例外情况。
如果将参数传递给函数,则可以在函数内部更改它。一旦该函数执行完成,传入的变量将重命名不变。
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
这样做主要有三个原因。
减少内存使用
每次调用函数时,都会复制并传递参数。当您传递数字时,这没什么大不了的。然而,当你处理大块内存时,比如对象、结构、数组等。这变得非常昂贵。
所以所有复杂类型通常都作为指针传递。如果你四处乱扔物体,你总是在使用指针。
在此实例中应使用 const
限定符以指示不会更改变量。
修改参数
有时修改传递的参数很有用,但应避免这种做法,因为这是一种不好的风格。我认为最好的例子是修改数组,例如 push()
函数。另一个是修改对象 public 成员,或者当你想 return 来自一个函数的多个值时。
请注意,这可能是错误的来源。如果您正在修改传递的变量,那么从函数名称中应该可以清楚地看出您正在做的事情。
低级内存访问
任何直接使用内存的东西都需要直接访问所述内存。 C 中的标准做法,但在 C++ 中不太常见。查看 memcpy()
等函数以及 <string.h>
.
中的任何其他函数
这样做的原因包括:
- 我需要修改一个不属于被调用函数本地的变量。
- 我想将一个单词传递给函数,而不是复制一个大型结构或数组(如果我需要修改它,可能还要复制一个)。
- 它是一个指向共享内存的指针,我希望更改在不同的进程或线程中可见。
- 它是指向多态结构或联合(或 C++ 中的 class)的指针,我希望该函数能够在运行时确定正确的类型。
- 数据的大小和类型可能会有所不同,如
memcpy()
。
- 该类型对客户端代码应该是不透明的。
- 接口就是这样指定的。
按值传递:当我们不想从被调用函数更改变量值时。
通过引用传递:(仅。在 c++ 中,而不是在 c 中):当我们想通过调用的函数对变量进行更改时。
通过指针传递:从periferi开始,它的工作原理与参考相同,但存在差异..
我习惯于在自己的代码中定期传递参数,但在阅读其他人的 C++ 代码时经常偶然发现函数参数通过引用或指针传递。我不明白这样做的目的是什么。有人可以解释一下吗?
如果我将一堆字符传递给函数,我可以在函数内部更改它们,而在函数外部它们将保持不变。这意味着如果您想将某些文本大写,则必须复制它,然后更改其中的一些字母。
另一方面,如果您告诉函数该字符串在内存中的地址,则它可以更改现有字符串而无需复制。有时,所需的参数会占用很小的空间。其他时候,所需的数据需要数百 mega/giga/tera 字节。你最不想做的就是读入所有内容,然后复制一份你可以发送给一个函数。
引用和指针之间的区别主要是程序员的语法方便,但也有重要的例外情况。
如果将参数传递给函数,则可以在函数内部更改它。一旦该函数执行完成,传入的变量将重命名不变。
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
这样做主要有三个原因。
减少内存使用
每次调用函数时,都会复制并传递参数。当您传递数字时,这没什么大不了的。然而,当你处理大块内存时,比如对象、结构、数组等。这变得非常昂贵。
所以所有复杂类型通常都作为指针传递。如果你四处乱扔物体,你总是在使用指针。
在此实例中应使用 const
限定符以指示不会更改变量。
修改参数
有时修改传递的参数很有用,但应避免这种做法,因为这是一种不好的风格。我认为最好的例子是修改数组,例如 push()
函数。另一个是修改对象 public 成员,或者当你想 return 来自一个函数的多个值时。
请注意,这可能是错误的来源。如果您正在修改传递的变量,那么从函数名称中应该可以清楚地看出您正在做的事情。
低级内存访问
任何直接使用内存的东西都需要直接访问所述内存。 C 中的标准做法,但在 C++ 中不太常见。查看 memcpy()
等函数以及 <string.h>
.
这样做的原因包括:
- 我需要修改一个不属于被调用函数本地的变量。
- 我想将一个单词传递给函数,而不是复制一个大型结构或数组(如果我需要修改它,可能还要复制一个)。
- 它是一个指向共享内存的指针,我希望更改在不同的进程或线程中可见。
- 它是指向多态结构或联合(或 C++ 中的 class)的指针,我希望该函数能够在运行时确定正确的类型。
- 数据的大小和类型可能会有所不同,如
memcpy()
。 - 该类型对客户端代码应该是不透明的。
- 接口就是这样指定的。
按值传递:当我们不想从被调用函数更改变量值时。
通过引用传递:(仅。在 c++ 中,而不是在 c 中):当我们想通过调用的函数对变量进行更改时。
通过指针传递:从periferi开始,它的工作原理与参考相同,但存在差异..