在C ++中,&函数的返回类型后的意思是什么?

时间:2010-03-04 14:12:49

标签: c++

在像这样的C ++函数中:

int& getNumber();

&是什么意思?它与以下不同:

int getNumber();

11 个答案:

答案 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;名称

     

哪里是类型而且是   类型为引用的标识符   到。

     

示例:

     
      
  1. int A = 5;
  2.   
  3. INT&安培; rA = A;
  4.   
  5. extern int&amp; rB中;
  6.   
  7. INT&安培; foo();
  8.   
  9. void bar(int&amp; rP);
  10.   
  11. class MyClass {int&amp; M_B; / * ... * /};
  12.   
  13. int funcX(){return 42; }; int(&amp; xFunc)()= funcX;
  14.         

    这里,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;),暗指指针解除引用。

特别注意,所有生命周期问题(例如不按地址返回堆栈变量)仍然需要像使用指针一样进行处理。