Search code examples
c++pointerscoding-stylereference

What are some of the disadvantages of using a reference instead of a pointer?


Given a class "A" exists and is correct. What would be some of the negative results of using a reference to "A" instead of a pointer in a class "B". That is:

// In Declaration File
class A;

class B
{
public:
   B();
   ~B();
private:
    A& a;
};

// In Definition File
B::B(): a(* new A())
{}

B::~B()
{
    delete &a;
}

Omitted extra code for further correctness of "B", such as the copy constructor and assignment operator, just wanted to demonstrate the concept of the question.


Solution

  • The immediate limitations are that:

    • You cannot alter a reference's value. You can alter the A it refers to, but you cannot reallocate or reassign a during B's lifetime.
    • a must never be 0.

    Thus:

    • The object is not assignable.
    • B should not be copy constructible, unless you teach A and its subtypes to clone properly.
    • B will not be a good candidate as an element of collections types if stored as value. A vector of Bs would likely be implemented most easily as std::vector<B*>, which may introduce further complications (or simplifications, depending on your design).

    These may be good things, depending on your needs.

    Caveats:

    • slicing is another problem to be aware of if a is assignable and assignment is reachable within B.