Pointer vs. Reference

后端 未结 12 1406
闹比i
闹比i 2020-11-22 11:13

What would be better practice when giving a function the original variable to work with:

unsigned long x = 4;

void func1(unsigned long& val) {
     val          


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

    Pointers

    • A pointer is a variable that holds a memory address.
    • A pointer declaration consists of a base type, an *, and the variable name.
    • A pointer can point to any number of variables in lifetime
    • A pointer that does not currently point to a valid memory location is given the value null (Which is zero)

      BaseType* ptrBaseType;
      BaseType objBaseType;
      ptrBaseType = &objBaseType;
      
    • The & is a unary operator that returns the memory address of its operand.

    • Dereferencing operator (*) is used to access the value stored in the variable which pointer points to.

         int nVar = 7;
         int* ptrVar = &nVar;
         int nVar2 = *ptrVar;
      

    Reference

    • A reference (&) is like an alias to an existing variable.

    • A reference (&) is like a constant pointer that is automatically dereferenced.

    • It is usually used for function argument lists and function return values.

    • A reference must be initialized when it is created.

    • Once a reference is initialized to an object, it cannot be changed to refer to another object.

    • You cannot have NULL references.

    • A const reference can refer to a const int. It is done with a temporary variable with value of the const

      int i = 3;    //integer declaration
      int * pi = &i;    //pi points to the integer i
      int& ri = i;    //ri is refers to integer i – creation of reference and initialization
      

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

    You should pass a pointer if you are going to modify the value of the variable. Even though technically passing a reference or a pointer are the same, passing a pointer in your use case is more readable as it "advertises" the fact that the value will be changed by the function.

    0 讨论(0)
  • 2020-11-22 11:28

    A reference is an implicit pointer. Basically you can change the value the reference points to but you can't change the reference to point to something else. So my 2 cents is that if you only want to change the value of a parameter pass it as a reference but if you need to change the parameter to point to a different object pass it using a pointer.

    0 讨论(0)
  • 2020-11-22 11:29

    If you have a parameter where you may need to indicate the absence of a value, it's common practice to make the parameter a pointer value and pass in NULL.

    A better solution in most cases (from a safety perspective) is to use boost::optional. This allows you to pass in optional values by reference and also as a return value.

    // Sample method using optional as input parameter
    void PrintOptional(const boost::optional<std::string>& optional_str)
    {
        if (optional_str)
        {
           cout << *optional_str << std::endl;
        }
        else
        {
           cout << "(no string)" << std::endl;
        }
    }
    
    // Sample method using optional as return value
    boost::optional<int> ReturnOptional(bool return_nothing)
    {
        if (return_nothing)
        {
           return boost::optional<int>();
        }
    
        return boost::optional<int>(42);
    }
    
    0 讨论(0)
  • 2020-11-22 11:29

    Use a reference when you can, use a pointer when you have to. From C++ FAQ: "When should I use references, and when should I use pointers?"

    0 讨论(0)
  • 2020-11-22 11:32

    This ultimately ends up being subjective. The discussion thus far is useful, but I don't think there is a correct or decisive answer to this. A lot will depend on style guidelines and your needs at the time.

    While there are some different capabilities (whether or not something can be NULL) with a pointer, the largest practical difference for an output parameter is purely syntax. Google's C++ Style Guide (https://google.github.io/styleguide/cppguide.html#Reference_Arguments), for example, mandates only pointers for output parameters, and allows only references that are const. The reasoning is one of readability: something with value syntax should not have pointer semantic meaning. I'm not suggesting that this is necessarily right or wrong, but I think the point here is that it's a matter of style, not of correctness.

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