GeekyMukesh Ответов: 1

Можно ли инициализировать ссылочную переменную переменной-указателем?


#include <stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
class Base
{
    public:
        int a;
        Base():a(0){};
        Base(int x):a(x){};
        void geta(){
            cout<<"a="<<a<<endl;
        }
};
int main()
{
    Base b1(5);
    Base *b3 = &b1;
    Base &b2 = *b3;   //Is it okay?
    b2.geta();
    b3->geta();
    Base b4(10);
    b3 =  &b4;
    b2.geta();
    b3->geta();   
    return 0;
}


Что я уже пробовал:

Приведенный выше код компилируется и выдает желаемый результат.
Выход:
а=5
а=5
а=5
а=10
Мой вопрос:
1. Можно ли инициализировать ссылочную переменную переменной-указателем?
2. Если инициализация ссылочной переменной указателем разрешена, то при печати b2.geta(); и
b3->geta(); во второй раз, то оба должны были дать одно и то же значение. Почему они разные?

1 Ответов

Рейтинг:
10

User 59241

Ваш вопрос :

Цитата:
Можно ли инициализировать ссылочную переменную переменной-указателем?

Да, мы можем: ваш код демонстрирует это.
Следующая вещь-это "
Цитата:
и то, и другое должно было иметь одинаковую ценность. Почему они разные?


Вывод правильный. Именно поэтому мы используем указатели. Указатели - Учебники По C++ [^]
int main()
{
	Base b1(5);
	Base *b3 = &b1;   // Create pointer b3 and set to point to b1 b3->a==5
	Base &b2 = *b3;   // Create reference b2 and inititialize to whatever b3 points to which is b1 
	// NOTE at this line *b3 dereferences b3 which results in b1. If b3 did not point to a valid object (eg b3==NULL) this would cause the next line to fail at runtime

	b2.geta();
	b3->geta();

	Base b4(10);
	b3 = &b4;         // Now point b3 to b4 b3->a == 10
	cout << "a=" << b3->a << endl;
	b2.geta();
	b3->geta();
	return 0;
}


Вы устанавливаете указатель b3, чтобы указать на b1, но позже вы устанавливаете его, чтобы указать на b4. Таким образом, выход правильный.
Вы можете посмотреть, что происходит, используя ваш debubugger.


CPallini

5.

GeekyMukesh

Спасибо pwasser, за ответ и подробное объяснение.
Просто хотел добавить информацию о том, что мы должны избегать назначения нулевого указателя на ссылку, как показано ниже:

int *p=0;
int &q = *p;

Этот код будет компилироваться, но результат будет очень неожиданным, может быть ошибка сегментации.

[no name]

Спасибо за комментарий. Однако ваша точка зрения уже упомянута:
Цитата: // примечание в этой строке *b3 разыменовывает b3, что приводит к b1. Если b3 не указывает на допустимый объект (например, b3==NULL), это приведет к сбою следующей строки во время выполнения