In C++, what does & mean after a function's return type?

后端 未结 11 1343
情歌与酒
情歌与酒 2020-11-29 23:49

In a C++ function like this:

int& getNumber();

what does the & mean? Is it different from:

int getNumb         


        
相关标签:
11条回答
  • 2020-11-30 00:11

    Yes, it's different.

    The & means you return a reference. Otherwise it will return a copy (well, sometimes the compiler optimizes it, but that's not the problem here).

    An example is vector. The operator[] returns an &. This allows us to do:

    my_vector[2] = 42;
    

    That wouldn't work with a copy.

    0 讨论(0)
  • 2020-11-30 00:16

    It means that it is a reference type. What's a reference?

    Wikipedia:

    In the C++ programming language, a reference is a simple reference datatype that is less powerful but safer than the pointer type inherited from C. The name C++ reference may cause confusion, as in computer science a reference is a general concept datatype, with pointers and C++ references being specific reference datatype implementations. The declaration of the form:

    Type & Name

    where is a type and is an identifier whose type is reference to .

    Examples:

    1. int A = 5;
    2. int& rA = A;
    3. extern int& rB;
    4. int& foo ();
    5. void bar (int& rP);
    6. class MyClass { int& m_b; /* ... */ };
    7. int funcX() { return 42 ; }; int (&xFunc)() = funcX;

    Here, rA and rB are of type "reference to int", foo() is a function that returns a reference to int, bar() is a function with a reference parameter, which is reference to int, MyClass is a class with a member which is reference to int, funcX() is a function that returns an int, xFunc() is an alias for funcX.

    Rest of the explanation is here

    0 讨论(0)
  • 2020-11-30 00:18

    It's a reference, which is exactly like a pointer except you don't have to use a pointer-dereference operator (* or ->) with it, the pointer dereferencing is implied.

    Especially note that all the lifetime concerns (such as don't return a stack variable by address) still need to be addressed just as if a pointer was used.

    0 讨论(0)
  • 2020-11-30 00:19

    It's different.

    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;
    }
    

    the getNumberReference() returns a reference, under the hood it's like a pointer that points to an integer variable. Any change applyed to the reference applies to the returned variable.

    The getNumberReference() is also a left-value, therefore it can be used like this:

    getNumberReference() = 10;
    
    0 讨论(0)
  • 2020-11-30 00:21

    Yes, the int& version returns a reference to an int. The int version returns an int by value.

    See the section on references in the C++ FAQ

    0 讨论(0)
  • 2020-11-30 00:23

    "&" means reference, in this case "reference to an int".

    0 讨论(0)
提交回复
热议问题