Можно ли объявить ссылочный член C ++ без инициализации с помощью объявления?

Опубликовано: 2 Декабря, 2021

Многим читателям это может показаться одним и тем же, т. Е.

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

такой же как

class_type * var = & some_work;

Но на самом деле это не так. Когда объявление и инициализация выполняются на одном шаге, компилятор вызывает конструктор копирования, тогда как, если это сделано на другом шаге, компилятор вызывает конструктор по умолчанию.
Чтобы понять это, давайте рассмотрим пример:
Пример 1: Когда инициализация не выполняется на том же этапе объявления

CPP

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

Выход:

 10

Пример 2: Когда инициализация выполнена с объявлением

CPP

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

Ошибки компиляции:

 prog.cpp: В конструкторе 'A :: A (int)':
prog.cpp: 8: 5: ошибка: неинициализированный ссылочный элемент в 'int &' [-fpermissive]
     A (int w)
     ^
prog.cpp: 5: 10: примечание: 'int & A :: p' должен быть инициализирован
     int & p;
          ^

Примечание. В этом коде, как только объект будет создан, компилятор выделит память для p, запустив конструктор класса A. Теперь, когда мы знаем, что ссылочная переменная должна быть инициализирована на том же этапе, появится сообщение об ошибке с именем «Ссылочный элемент не инициализирован».
Как мы видели в коде 1, инициализация не выполняется на том же этапе объявления, но, тем не менее, наш код выполняется. Но в целом существует правило, согласно которому « ссылочный член должен быть инициализирован и объявлен на одном этапе ».
Итак, ответ на поставленный выше вопрос - и да, и нет.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .