Can C++ reference member be declared without being initialized with declaration?

To many readers, this might sound the same thing, i.e.

class_type *var = NULL;
*var = &some_work;

is same as

class_type *var = &some_work;

But in actual, it is not. When the declaration and initialization are done at the same step, the compiler calls the copy constructor whereas if done in another step, the compiler calls the default constructor.

To understand this, let’s consider an example:



Example 1: When initialisation is not done at the same step of the declaration

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <iostream>
using namespace std;
  
class A {
    int& p;
  
    // Note:basically it is
    // supposed to be an error
    // because this reference
    // member p is not initialized
    // with some variable at the same
    // step of its declaration. But it
    // will run in this case. For us,
    // this is the declaration but
    // not for compiler
  
public:
  
    // this line
    // means int &p=w, so p and w
    // both are same. Compiler considers
    // this step as declaration and
    // initialization is done at
    // same step.
    A(int w): p(w)
    {
        cout << p;
    }
};
int main()
{
    A obj(10);
    return 0;
}

chevron_right


Output:

10

Example 2: When initialization is done with the declaration

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <iostream>
using namespace std;
  
class A {
    int& p;
  
public:
  
    // In this step,
    // compiler will see only
    // declaration not initialization.
    // Therefore this code will
    // give an error.
    A(int w)
    {
        p = w;
        cout << p;
    }
};
int main()
{
    A obj(10);
    return 0;
}

chevron_right


Compile Errors:

prog.cpp: In constructor 'A::A(int)':
prog.cpp:8:5: error: uninitialized reference member in 'int&' [-fpermissive]
     A(int w)
     ^
prog.cpp:5:10: note: 'int& A::p' should be initialized
     int& p;
          ^

Note: In this code, as soon as an object is created compiler will allocate memory to p by running the constructor of class A. Now as we know reference variable needs to be initialized at the same step so it will pop up an error message called “reference member is not initialized” .

As we have seen in code 1, initialisation is not done at the same step of the declaration, but still, our code runs. But in general, it is a rule that “reference member should be initialised and declared at the same step.”

So the answer to the above question is both yes and no.



My Personal Notes arrow_drop_up

Hello friends, I have a deep knowledge on programming language like C,C++,Java,especially in C and Java I like to do comparative study and likes to ask question ie if , why and why not we In future, i want to be an entrepreneur and really focus on how to improve Education System

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.