2010-06-03 131 views
1

一个简单的问题:传递变量函数

当我一个变量传递给一个函数,并计划使该变量的副本功能使用?

如果它确实存在,我知道该函数只会读取变量并且永远不会写入该变量,是否可以将该变量传递给该函数而不创建该变量的副本,或者我应该只保留该变量编译器优化为我自动做到这一点?

+3

您使用的是什么C++文本书,并没有详细说明这一点? – 2010-06-03 20:43:19

+0

什么课本? – Faken 2010-06-03 20:44:24

+2

这就是问题所在。 :)你应该从一本很好的教科书中学习,我们在这里有一个大列表:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG 2010-06-03 20:48:47

回答

6

是的,复制通过值传递的参数。但是,您也可以通过引用传递变量。引用是一个别名,所以这使得该参数成为变量的别名,而不是副本。例如:

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。作为一个好的经验法则,基本类型(int,char *等)和类型与sizeof(T) < sizeof(void*)应该通过值来传递,而不是的const引用,因为它们的大小足够小,复制将比锯齿更快。

2

是的。
如果你知道你可以传递参数为const &像这样:

int function(const string& str) {} 

对于小的类型,如int或float和char这不值得冒这个险,因为经过参考相同的传递INT。只有当你传递诸如vectorstring之类的大事情时,这样做才有意义。

编译器很可能不会为你做这个优化,因为在大多数情况下它不知道它是允许的。

0

如果使用引用,则只传递别名。如果你不这样做,将会有一个副本。这取决于你需要对变量做什么。如果你需要使用这些参数,但不能改变它们,那么const引用是最好的解决方案(效率和语义方面),除非是非常小的类型。

1

如果该功能通过复制接收的变量,是程序没有进行复制:

void function(int pass_by_value); 

如果函数引用接收变量,没有,程序不进行复印,但使用原始变量:
void function2(int & pass_by_reference);

如果该函数不修改变量,函数应该接收恒定基准:
void function3(const int & pass_by_constant_reference);

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

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

0

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

myFunction的(X)或myFunction的(& X)

希望它能帮助:)

Başak比尔基