0

我对在函数参数中使用别名有疑问。这是我的问题。

让我们考虑这个函数定义

void thisIsSparta(int& number){
    ...
}

在调用时,它与以下代码完美配合:

int king = 1;
thisIsSparta(king);

但是当我尝试这个时出现不匹配错误:

thisIsSparta(1);

我可以很容易地猜到错误的发生,因为根本没有别名变量,因此错误。但是,我不希望程序员担心只使用这两种方法中的一种,第二个函数调用应该可以正常工作!

我看到的唯一解决方案是创建另一个没有别名参数的函数,除了第一个:

void thisIsSparta(int number){

}

但这会导致可怕的代码重复,我不是这个的超级粉丝。

此外,当我使用变量时,程序可以决定使用第二个定义而不是前者。然后我失去了别名的兴趣,其目的是避免变量复制。

有没有人可以解决我的问题?事实上,这是一个简化的例子,实际上我在这个函数的参数中有一个泛型类型,它可以任意大。这就是为什么我想使用别名来避免复制。

4

3 回答 3

4

对于基本类型,只需按值传递。它比传递引用要快,所以放弃通过引用传递,只需要

void thisIsSparta(int number)

对于大型类型,您只能将临时对象绑定到const引用,因此您可以将方法声明为

void thisIsSortOfSparta(const MyClass& obj)

如果您正在修改函数内部的值,那么将临时参数作为参数传递是没有意义的,因此编译器抱怨是正确的,但如果您不这样做,请使用上述两个选项。

于 2013-01-25T14:50:37.223 回答
2

复制原始样int完全可以忽略不计。由于几个原因,通过参考可能更昂贵。

其次,你可以超载

const int&
int&

这将为所有int对象选择第二个,为临时对象和const int对象选择第一个。

于 2013-01-25T14:51:42.260 回答
1

通过引用传递参数的问题是函数可以修改它:

void thisIsSparta(int& number) {
    ++number;
}

现在,该怎么thisIsSparta(1)办?(不,这不是古老的 FORTRAN,在那里修改常量是可能的......)

如果你想传递不可修改的变量,函数必须保证不修改它的参数:

void thisIsSparta(const int& number) {
    // whatever
}

而且,正如其他人指出的那样,对于内置类型,按值传递总是比通过 const 引用传递更可取:

void thisIsSparta(int number) {
    // whatever
}
于 2013-01-25T15:48:08.880 回答