我们说我有一个功能:
void function(int& i){};
和变量:
int j = 2;
我知道我可以使用我的功能:
function(j);
但它是不一致的:编译器应该注意到函数需要引用,而不是正常变量,而我试图使用普通变量( int&!= int )并中止汇编。但是,发明C ++的人实现了这种行为。这对我来说似乎不合逻辑。
为什么可能?有什么我不明白的东西,或者C ++的sytax真的不一致吗?
注意:我不询问我何时应该通过引用按值传递参数或者这些方法之间的区别是什么(有关于此主题的简明材料) 。我只是想知道为什么它的工作方式 - 语法似乎与我相矛盾。
为什么我不需要引用通过引用传递参数?:
int& k = j;
function(k);
编辑:我对绑定对变量的引用没有任何疑问,我认为以下代码清晰且合乎逻辑: INT和放大器; k = j;
我唯一怀疑是通过引用传递参数:
void function(int& i){};
int j = 2;
function(j);
答案 0 :(得分:2)
为什么我不需要引用通过引用传递参数?
简短版本就是所有重要的方式,i
有效已经一个参考。
长版本是当您声明类型为int&
的参数时,不表示“整数引用”。它意味着“一个整数左值”,这是另一回事。正如您所注意到的,整数引用只是生成整数左值的一种方法 - 还有其他方法。 C ++表达式值类别和类型相互作用但不相同的系统。 i
是一个整数左值;因此它会接受这个论点。
答案 1 :(得分:1)
引用本身不是一个对象,它只是为对象创建另一个名称。别名。
使用int& k = j;
,您说k
和j
是同一对象的不同名称。当为某人使用昵称时,这类似于person& Bob = Robert;
。
那么,如果将k
或j
作为参数传递给函数,为什么它会有所作为?他们是一样的东西。就像鲍勃和罗伯特一样。
答案 2 :(得分:0)
答案很清楚。 c ++编译器没有'&'喜欢参考。它们都是相同的func(int& a)或func(int a)。编译器在两种情况下将其视为变量。但是如果你定义func就像func(int * a)那意味着我想要'a'参数的地址。你看到了不同吗? c ++的编译器层次结构与c编译器有点不同。