在像这样的C ++函数中:
int& getNumber();
&
是什么意思?它与以下不同:
int getNumber();
答案 0 :(得分:31)
不同。
int g_test = 0;
int& getNumberReference()
{
return g_test;
}
int getNumberValue()
{
return g_test;
}
int main()
{
int& n = getNumberReference();
int m = getNumberValue();
n = 10;
cout << g_test << endl; // prints 10
g_test = 0;
m = 10;
cout << g_test << endl; // prints 0
return 0;
}
getNumberReference()返回一个引用,它就像一个指向整数变量的指针。应用于引用的任何更改都适用于返回的变量。
getNumberReference()也是一个左值,因此它可以像这样使用:
getNumberReference() = 10;
答案 1 :(得分:26)
是的,int&
版本会返回对int
的引用。 int
版本按值返回int
。
请参阅C ++常见问题解答中的the section on references
答案 2 :(得分:9)
是的,情况有所不同。
&amp;表示您返回参考。否则它将返回一个副本(好吧,有时编译器会优化它,但这不是问题)。
一个例子是矢量。 operator []返回&amp ;.这允许我们这样做:
my_vector[2] = 42;
这对副本无效。
答案 3 :(得分:5)
不同之处在于,没有&
你得到的是返回的int的副本,适合传递到其他例程,比较东西或复制到你自己的变量。
使用&
,您获得的内容基本上是包含返回整数的变量。这意味着您实际上可以将其放在作业的左侧,如下所示:
getNumber() = 200;
答案 4 :(得分:4)
int& getNumber()
:function通过引用返回一个整数。
int getNumber()
:函数按值返回一个整数。
它们在某些方面有所不同,其中一个有趣的区别是第一种类型可以在赋值的左侧使用,这是第二种类型无法实现的。
示例:
int global = 1;
int& getNumber() {
return global; // return global by reference.
}
int main() {
cout<<"before "<<global<<endl;
getNumber() = 2; // assign 2 to the return value which is reference.
cout<<"after "<<global<<endl;
return 0;
}
Ouptput:
before 1
after 2
答案 5 :(得分:4)
第一个版本允许您编写getNumber() = 42
,这可能不是您想要的。当您为自己的容器类型重载operator[]
时,返回引用非常有用。它使您可以编写container[9] = 42
。
答案 6 :(得分:3)
“&安培;”表示引用,在本例中为“引用int”。
答案 7 :(得分:3)
这意味着它是一种参考类型。什么是参考?
维基百科:
在C ++编程语言中,引用是一种简单的引用数据类型,它比从C继承的指针类型更强大但更安全。名称C ++引用可能会引起混淆,因为在计算机科学中引用是一般概念数据类型,指针和C ++引用是特定的引用数据类型实现。表格声明:
Type&amp;名称
哪里是类型而且是 类型为引用的标识符 到。
示例:
- int A = 5;
- INT&安培; rA = A;
- extern int&amp; rB中;
- INT&安培; foo();
- void bar(int&amp; rP);
- class MyClass {int&amp; M_B; / * ... * /};
- int funcX(){return 42; }; int(&amp; xFunc)()= funcX;
醇>这里,rA和rB属于“参考” to int“,foo()是一个函数 返回对int的引用,bar()是一个 带参考参数的函数, 这是对int的引用,MyClass是 一个成员的班级 引用int,funcX()是一个 返回int的函数,xFunc() 是funcX的别名。
其余的解释是here
答案 8 :(得分:3)
这是一个参考
答案 9 :(得分:1)
这意味着它将reference返回给int,而不是int本身。
答案 10 :(得分:1)
它是一个引用,它与指针完全相同,只是你不必使用指针引用运算符(*或 - &gt;),暗指指针解除引用。
特别注意,所有生命周期问题(例如不按地址返回堆栈变量)仍然需要像使用指针一样进行处理。