What is a reference variable in C++?

后端 未结 12 2109
孤城傲影
孤城傲影 2020-11-22 08:41

What would be a brief definition of a reference variable in C++?

相关标签:
12条回答
  • 2020-11-22 09:14

    The first paragraph of the Wikipedia article could easily serve as a brief definition:

    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.

    And quoting from the same article:

    C++ references differ from pointers in several essential ways:

    • It is not possible to refer directly to a reference object after it is defined; any occurrence of its name refers directly to the object it references.

    • Once a reference is created, it cannot be later made to reference another object; it cannot be reseated. This is often done with pointers.

    • References cannot be null, whereas pointers can; every reference refers to some object, although it may or may not be valid.

    • References cannot be uninitialized. Because it is impossible to reinitialize a reference, they must be initialized as soon as they are created. In particular, local and global variables must be initialized where they are defined, and references which are data members of class instances must be initialized in the initializer list of the class's constructor.

    Further reading:

    • Wikipedia: Reference C++
    • Cprogramming.com: C++ References
    • Stack Overflow: Difference between pointer variable and reference variable in C++
    0 讨论(0)
  • 2020-11-22 09:14

    A reference is an alternative label, an alias, for the object it is initialized with. Once a reference is initialized it can not be changed to be an alternative label or alias of some other object. After the initialization the reference or the object variable may be used interchangeably.

    A reference has some of the characteristics of a const pointer to an object in that it is initialized when defined. And while what it references or points to can be changed, the reference or the const pointer itself can not be changed. However since a reference is an alternative label or alias it may or may not actually exist as a data object unlike a const pointer which will probably exist unless the compiler can optimize it away. And even if a reference is created as an actual entity by the compiler, that is compiler housekeeping and should be ignored since it officially does not exist much like the man behind the curtain in the Emerald City.

    The following code samples gives examples comparing and contrasting reference with pointer and const pointer:

    int myInt;           // create a variable of type int, value not initialized
    int myInt2 = 3;      // create a second variable of type int with a value of 3
    int &rInt = myInt;   // create a reference to the variable of type int, myInt
    
    rInt = 5;            // myInt now has a value of 5, the reference is an alias for myInt
    rInt++;              // myInt now has a value of 6, the reference is an alias for myInt
    rInt = myInt2;       // myInt now has the same value as myInt2, a value of 3
    int *pInt = &rInt;   // pInt points to myInt
    (*pInt)++;           // increments myInt
    pInt++;              // increments the pointer which formerly pointed to myInt
    
    int &rInt2;          // error C2530: 'rInt2' : references must be initialized
    int *pInt2;          // just fine, uninitialized pointer is ok
    int * const pInt3;   // error C2734: 'pInt3' : const object must be initialized if not extern
    int * const pInt4 = &myInt;  // define and initialize const pointer
    pInt4 = &myInt2;     //  error C3892: 'pInt4' : you cannot assign to a variable that is const
    

    There are actually two kinds of references: an lvalue reference and an rvalue reference.

    An lvalue reference is the same reference in the C++ language before C++11. An rvalue reference was introduced in C++11 to allow for a reference to a temporary object to assist with doing a move rather than a copy and some other actions where a copy is the wrong approach but a move is the right approach.

    For example a comparison of lvalue reference and rvalue reference in the following simple source lines. Because these are int references that means that an assignment of a non-integer value results in the compiler doing a conversion which results in a temporary variable. An rvalue reference can bind to a temporary variable and an lvalue reference can not.

    // assign a double to an int causing creation of temporary    
    int &rIntd1 = 1.2;   // error C2440: 'initializing' : cannot convert from 'double' to 'int &'
    int &&rIntd2 = 1.2;  // warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data
    
    rInt = rIntd2;       // myInt from the code above now has a value of 1, 1.2 was truncated when converting from double to int
    
    0 讨论(0)
  • 2020-11-22 09:14

    Reference variables (let a), just say for easy understanding, another name of variable (let x), which holds the same exact memory location as that of x.

    int &a = x; refers that a holds same memory location as that of x.

    For example, say two roommates share the same room. One friends name is x and another friends name is a. If a changes the location of the table placed in the room, from position (x,y,z) to (x1,y1,z1) then changes are visible to friend x as well and vice versa.

    0 讨论(0)
  • 2020-11-22 09:17

    A reference is an entity that is an alias for another object.

    A reference is not a variable as a variable is only introduced by the declaration of an object. An object is a region of storage and, in C++, references do not (necessarily) take up any storage.

    As objects and references are distinct groups of entities in C++ so the term "reference variable" isn't meaningful.

    0 讨论(0)
  • 2020-11-22 09:19

    A reference variable is an alias (an alternate name) for an object. [From the C++ FAQ].

    0 讨论(0)
  • 2020-11-22 09:21

    A reference is an alternative name for an object. A reference variable provides an alias for previously defined variables. A reference declaration consists of a base type an & a reference variable equated to a variable name.

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