繁体   English   中英

将变量传递给函数

[英]Passing variables to functions

一个简单的问题:

当我将变量传递给函数时,程序是否会复制该变量以在函数中使用?

如果可以,并且我知道该函数只会读取该变量而不会写入该变量,是否可以将变量传递给该函数而无需创建该变量的副本,或者我应该将其留给编译器优化来完成对我来说自动吗?

是的,复制了按值传递的参数。 但是,您也可以通过引用传递变量。 引用是别名,因此这使参数成为变量的别名,而不是副本的别名。 例如:

void foo(int x) {}
void bar(int& x) {}

int i;

foo(i); // copies i, foo works with a copy
bar(i); // aliases i, bar works directly on i

如果将其标记为const,则具有只读别名:

void baz(const int&);

baz(i); // aliases i, baz reads-only i

通常,始终通过const-reference传递。 当您需要修改别名时,删除const。 最后,当您需要副本时,只需按值传递即可。*

*并且作为一个好的经验法则,基本类型(int,char *等)和具有sizeof(T) < sizeof(void*)应该通过值而不是const-reference传递,因为它们的大小足够小复制将比别名更快。

是的,它确实。
如果您知道可以像这样将参数作为const&传递:

int function(const string& str) {}

对于像int或float或char这样的小类型,这不值得麻烦,因为传递引用与传递int相同。 仅当您传递vectorstring的大东西时,这样做才有意义。

编译器很可能不会为您进行此优化,因为在大多数情况下,编译器不知道允许这样做。

如果函数通过拷贝接收变量,则是的,程序会进行拷贝:

  void function(int pass_by_value);

如果函数通过引用接收变量,否,则程序不会复制,而是使用原始变量:
void function2(int & pass_by_reference);

如果函数未修改变量,则该函数应收到一个常量引用:
void function3(const int & pass_by_constant_reference);

通常,类和结构应通过常量引用传递。 可以按值传递POD(普通旧数据)类型。

在C ++中,您需要告诉函数的编译器和用户,如何传递变量以及是否修改变量。

如果使用引用,则仅传递别名。 如果您不这样做,将进行复制。 这取决于您需要对变量执行什么操作。 如果您需要使用参数但不更改它们,则const引用是最佳解决方案(从效率和语义上来说),除非对于非常小的类型。

在函数内部使用const引用(const&)的情况下,可以使用实际变量的值,不生成任何副本,但是您不能修改原始变量的值,为此,只需在其中使用&或(*)函数定义,函数调用如下:

myFunction(x)或myFunction(&x)

希望能帮助到你:)

巴沙克比尔吉

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM