我在函数参数中使用别名时遇到问题。这是我的问题。
让我们考虑一下这个函数定义
void thisIsSparta(int& number){
...
}
在通话时,它与以下代码完美配合:
int king = 1;
thisIsSparta(king);
但是当我尝试这个时我遇到了不匹配的错误:
thisIsSparta(1);
我很容易猜到错误的发生,因为别名没有变量,因此错误。但是,我不希望程序员担心只使用这两种方法中的一种,这第二次函数调用应该可以正常工作!
我看到的唯一解决方案是创建另一个没有别名参数的函数,除了第一个:
void thisIsSparta(int number){
}
但这会导致糟糕的代码重复,我不是这个的忠实粉丝。
此外,当我使用变量时,程序可以决定使用第二个定义而不是前者。然后我放弃了别名的兴趣,其目的是避免变量复制。
有没有人能解决我的问题?实际上,这是一个简化的例子,实际上我在这个函数的参数中有一个泛型类型,它可能是任意大的。这就是为什么我想使用别名来避免复制。
答案 0 :(得分:3)
对于基本类型,只需按值传递。它比传递引用更快,所以放弃引用传递,只需要
void thisIsSparta(int number)
对于大型类型,您只能将临时值绑定到const
引用,因此您可以将方法声明为
void thisIsSortOfSparta(const MyClass& obj)
如果你正在修改函数内部的值,那么传递一个临时的参数是没有意义的,所以编译器是正确的抱怨,但如果你没有,请使用上面两个选项。
答案 1 :(得分:2)
复制像int
这样的原语完全可以忽略不计。由于一些原因,传递引用可能更昂贵。
其次,你可以用
重载const int&
int&
这将为所有int
个对象选择第二个,并为临时对象和const int
对象选择第一个。
答案 2 :(得分:1)
通过引用传递参数的问题是函数可以修改它:
void thisIsSparta(int& number) {
++number;
}
现在,thisIsSparta(1)
会做什么? (不,这不是古老的FORTRAN,可以修改常数......)
如果要传递不可修改的变量,函数必须承诺不修改其参数:
void thisIsSparta(const int& number) {
// whatever
}
并且正如其他人所指出的那样,对于内置类型,传递值总是优于传递const引用:
void thisIsSparta(int number) {
// whatever
}