2017-09-19 65 views
0

我是C++新手,现在通过参考学习调用。为什么我们必须将值而不是地址传递给C++中的“通过引用调用”函数?

我得知这个代码块在我的材料:

void callByRef(&a, &b); 

int main(){ 
    int k = 12; 
    int m = 4; 
    callByRef(k, m) //QUESTION HERE 
    return 0; 
} 

void callByRef(&a, &b){ 
    a += 3; 
    b -= 2; 
    return; 
} 

所以我的问题是宣告callByRef时,我们使用的a和b的地址作为参数,所以当我们调用callByRef为主,为什么我们需要通过(k,m)而不是(& k,& m)?

这是基本的,但我只是想为我未来的学习找到合适的图片。 谢谢你们!

+2

“我们使用a和b的地址作为参数”什么?该声明应该看起来像'void callByRef(int&a,int&b)',这就是__not__获取参数的地址,它声明它们为引用。 – tkausl

+1

'void callByRef(&a,&b)'[不是合法的C++](https://ideone.com/dpTUvj)。如果这是您的课程材料包含的内容,您应该抱怨并要求退款。 –

回答

0

callByRef()函数将引用作为参数传递,因此不需要将显式引用发送给该函数。请仔细阅读,以便更好地理解。

Tutorial

+0

感谢您的回答hahahakebab!现在阅读。 – Hang

2

&a操作装置变量a的地址,的*a操作装置的存储器由变量a寻址的内容。现在,函数定义以下:

void callByRef(int &a, int &b){ 
    a += 3; 
    b -= 2; 
    return; 
} 

其中int &a意味着一个将是一个reference int类型的一些变量。因此,无论何时您要调用函数,都需要传递变量本身而不是其地址,因此callByRef(a, b)而不是callByRef(&a, &b)

此类声明的原因如下,传递给函数的参数传递给值,即变量的内容被字面复制到函数变量中,因此函数内部的任何变化都不会产生任何影响。例如:

void callByVal(int a, int b){ 
    a += 3; 
    b -= 2; 
    return; 
} 

并具有:

x = 5; 
y = 10; 

主叫callByVal(x, y)不会对x和y的任何影响。为了克服这一点,你需要按引用或int &a或者你可以通过指针和直接更新内存的替代来传递参数:

void callByPtr(int *a, int *b){ 
    *a += 3; 
    *b -= 2; 
    return; 
} 

现在它是有意义的传递变量的地址,例如callByPtr(&a, &b)

0

您不通过价值。 C++中的引用不完全像指针。把它们当作一个物体的另一个名字。

当然你需要这个名字绑定到一个对象以便引用来引用它。因此,例如当我们编写int &i = k;时,我们说的是已经命名为k的变量可能被称为i。要绑定参考,我们需要名称另一个对象。而对象的名称是k,而不是&k

这同样适用于函数参数和参数。指定功能callByRef对两个对象进行操作,它将调用ab。当您调用该功能时,您必须名称它将引用的原始对象。原始对象被命名为km,而不是&k&m

相关问题