通过引用传递的问题

时间:2010-07-12 09:53:19

标签: c++ pass-by-reference overloading pass-by-value

我可以重载一个带引号或变量名的函数吗?

例如,当我尝试这样做时:

void function(double a);
void function(double &a);

我希望此函数的调用者能够:

double a = 2.5;
function(a); // should call function(double &a)
function(2.3); // should call function(double a)

我想编写pass-by-reference函数以便更好地使用内存并可能在范围之外操作变量,但是不必创建新变量就可以调用该函数。

这可能吗?

干杯

6 个答案:

答案 0 :(得分:8)

我认为你在这里忽略了这一点。你应该拥有的只是这个:

void function(const double &a);

注意“const”。有了这个,你应该总是得到传递参考。如果你有非const通过引用传递,那么编译器将正确地假设您希望修改传递的对象 - 当然这在概念上与传值的变体不兼容。

使用const引用,编译器将很乐意为您创建临时对象。非const版本不适合您,因为编译器只能将这些临时文件创建为“const”对象。

答案 1 :(得分:1)

我试过了,但失败了

至少在MSVC2008中,这是不可能的 - 我认为这适用于所有c ++ - 编译器。

定义本身有效,但在尝试调用函数时

function(a);

将变量作为参数,会引发编译器错误,因为编译器无法确定要使用的函数。

答案 2 :(得分:1)

void function(double const &a);  // instead of void function(double a);
void function(double       &a); 

答案 3 :(得分:0)

我不认为定义:

void function(double a);
void function(double &a);

是可能的......编译器如何知道为function(x)调用哪个函数? 如果要同时使用Reference和Value,则应使用两个不同的函数。这也会使代码比这种模糊的重载更容易阅读。

答案 4 :(得分:0)

通过引用传递POD类型没有任何好处,因为它们几乎总是(总是?)在注册表中传递。 通过const引用传递的复杂类型(由多于一个POD变量组成的复杂类型)通常(总是?:D)是复制和堆栈推送的一种可预见的方式。 您甚至可以通过创建explicit constructors

来控制从POD类型创建复杂类型变量的临时值

答案 5 :(得分:-1)

不,你不能这样做因为这两个函数都会有效地产生相同的错位名称,并且链接器将无法解析函数调用。