C ++:函数参数中的别名

时间:2013-01-25 14:49:05

标签: c++

我在函数参数中使用别名时遇到问题。这是我的问题。

让我们考虑一下这个函数定义

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

在通话时,它与以下代码完美配合:

int king = 1;
thisIsSparta(king);

但是当我尝试这个时我遇到了不匹配的错误:

thisIsSparta(1);

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

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

void thisIsSparta(int number){

}

但这会导致糟糕的代码重复,我不是这个的忠实粉丝。

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

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

3 个答案:

答案 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
}