Разность С++ между ссылкой, объектами и указателями

Это вопрос экзамена по продвинутому курсу ООП, преподаваемому на С++ (в университете TAU, в этом семестре):

Q: В чем разница между указателем на С++ и ссылкой?

A.  A reference is the entire object while a pointer is only the address of it.
B.  The same meaning, and difference is only in syntax and usage.
C.  The syntax used to access the object.
D.  Pointers are simple address to the object while a reference uses the virtual table.

Какой правильный ответ?

Учитель курса утверждает, что A является правильным и что ссылка на объект является, по сути, самим объектом. Это верно? Я понимаю, что доступ к ссылке эквивалентен доступу к самому объекту, однако при разрушении ссылки мы не уничтожаем сам объект. Ссылка является альтернативным именем для объекта, но говоря, что ссылка == object true?

BTW, лектор дал следующую ссылку на faq в качестве поддержки своего иска, цитата:

"Важное примечание. Несмотря на то, что ссылка часто выполняется с использованием адрес в базовой сборке языка, пожалуйста, не думайте о ссылка как забавный указатель к объекту. Ссылка - это объект. Это не указатель на объект или копия объекта. Это является объектом.

Но я считаю, что это неверно.

Ответы

Ответ 1

Они все ошибаются.

A ссылка по существу является синонимом другого объекта. Внутри он часто реализуется как указатель, но имеет синтаксис, как если бы это был объект, на который он ссылается.

Указатель - это отдельный объект, в котором хранится адрес памяти объекта, на который он указывает (или 0, если он не указывает на объект).

Можно сказать, что ссылка - это объект, к которому он относится (он, конечно, действует именно так), но это не так. Если ссылка выходит за пределы области видимости, то объект, на который он ссылается, не разрушается, поэтому ссылка не является объектом.

Ответ 2

Различие между ссылкой и объектом - вы можете иметь несколько ссылок на один и тот же объект. Объект имеет "идентификатор", в то время как сама ссылка не работает.

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

Ответ 3

(B) является ближайшим, но все еще не совсем правильным. Ссылка является синтаксическим сахаром для указателя const. Подобно указателю const, он должен быть привязан к lvalue при инициализации и никогда не сможет отскочить. Подобно указателю const, он является полиморфным.

EDIT: короткое доказательство того, что (A) неверно, поскольку по крайней мере пара людей защищают его:

struct A { int x; int f() { return 1; } }
struct B : public A { int y; int f() { return 2; } }

B b;
A& a = b;

assert(sizeof(a) == sizeof(b)); // fail
assert(a.f() == b.f()); // fail again

Ответ 4

Просто чтобы залезть на мое хобби-лошадь на мгновение, университеты не имеют никакого бизнеса в обучении людей тому, как программировать на определенных компьютерных языках. Тот факт, что они делают это просто показатель того, как они деградировали за последние 30 лет. Предполагалось, что я работаю в Лондонском университете с 1979 по 1983 год в качестве специалиста по микробиологии и программиста, и студенты микробиологии (обратите внимание, не студенты CS!) Должны были забрать, как использовать компьютеры и программировать более или менее самостоятельно, что они сделали, сколько им нужно.

Но в наши дни даже студенты из CS кажутся все в ложке и испытывают на этом "знании" почти невозможные тесты, например, те, которые цитируются OP.

Г!!!

Ответ 5

Важно различать:

  • Ссылка как выражение
  • Ссылка непосредственно

Часто задаваемые вопросы и преподаватель говорят о первом моменте, но вопрос учителя формулируется так, как если бы он спрашивал о втором вопросе. Чтобы объяснить точку зрения часто задаваемых вопросов, рассмотрите, что Стандарт описывает как самый первый этап обработки выражений

Если выражение первоначально имеет тип "ссылка на Т" (8.3.2, 8.5.3), тип до тех пор, пока какой-либо дальнейший анализ не будет изменен до "Т", выражение обозначает объект или функцию, обозначенные ссылкой, и выражение представляет собой lvalue

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

Теперь сама ссылка - это объект, который, как правило, ссылается на объект или функцию, но не хранит что-то самостоятельно.

Такую же ошибку в споре иногда делают люди, когда говорят, что массивы в C будут просто указателями. То, что они на самом деле означают, состоит в том, что массивы в выражениях (в основном) - только указатели. Но это не делает их обоих равными по своему усмотрению.

Ответ 6

Все ответы неверны, А ближе всего.

Указатель - это адрес объекта, который является самим объектом.
"Объект" - это "нечто" где-то в памяти. Экземпляр класса, int, float и т.д.
Ссылка является альтернативным способом доступа к объекту. Это ссылка на объект, но не на сам объект. Он может быть или не быть реализован как указатель. Вы можете подумать об этом как об альтернативном имени объекта, но это не совсем правильно. Ближайшие правильные описания, о которых я могу думать, это "альтернативный интерфейс для доступа/манипулирования объектом" (к сожалению, "интерфейс" звучит неверно, если вы принимаете ООП в учетной записи, хотя это (ИМО) наиболее правильно).

Ответ 7

Отвечая на вопрос, является ли учитель неправильным: Простая логика. Строго говоря, это то, что говорит имя (и стандарт): это ссылка to (= "имя" ) объекта, НЕ самого объекта. Как говорилось ранее, когда ссылочная переменная выходит за пределы области действия, деструктор объекта не вызывается, поэтому ссылка не объекта.

#include <iostream>
class A {
public:
    ~A()
    {
            std::cout << "~A() called.\n";
    }
};
void f(A &a)
{
    // a running out of scope...
}
int main()
{
    A a;
    std::cout << "calling f()\n";
    f(a);
    std::cout << "done calling f()\n";
    return 0;
}

Ответ 8

Одно из больших различий между указателями и ссылками, которые я не видел, это то, что указатель может быть NULL, а ссылка не может быть. Это не означает, что объект, на который ссылаются указатели ссылок, не может выйти из области видимости, что приводит к тем же типам проблем, с которыми люди сталкиваются с указателями, просто, что нет "не назначенного" состояния.

Ответ 9

Я считаю, что ваш учитель запутывает метафору и конкретное выражение. Ссылка определенно не является фактическим объектом, и она реализована как "смешной указатель", но точка этого утверждения заключается в том, что вы должны думать о ссылке как о фактическом объекте, на который вы ссылаетесь, вы не должны думать или программировать как если вы обрабатываете указатель. Синтаксически доступ к ссылке на объект идентичен доступу к самому объекту, за исключением нескольких случаев, упомянутых в комментариях ниже.

Ответ 10

Оцените один вариант за раз -

а. Ссылка - это весь объект, а указатель - только его адрес.

Нет такой вещи, как "весь объект"! это просто объект. Многие ссылки могут указывать на объект, а затем перестать ссылаться на него, хотя сам объект продолжает сохраняться. Неверный ответ!

В. Тот же смысл, и разница только в синтаксисе и использовании. Это НЕ одно и то же. Например, когда вы получаете & ref - вы не можете делать ref ++, где, как если бы вы получили * ptr, вы можете сделать ptr ++. Указатель не только позволяет вам обращаться к объектам, но позволяет арифметику указателей; тем самым с указателями вы можете передать не только 1 адрес (и изменить этот адрес), но весь массив произвольного местоположения с тем же синтаксисом. Вы не можете сделать это со ссылкой! Неверный Ans!

С. Синтаксис, используемый для доступа к объекту. Не совсем понял, как он представляет собой различие между двумя понятиями. Неверный Ans!

Д. Указатели - это простой адрес для объекта, а ссылка использует виртуальную таблицу. Я ничего не вижу в виртуальной таблице. Указатели обычно указывают на кучу, где в качестве ссылки находится указатель, сидящий внутри стека. Неверный Ans!

Все неправильно...

Dipan.

Ответ 11

Вопрос не в объектах и ​​ссылках, а на указателях и ссылках. Дело в том, что указатели обозначают местоположение памяти, а ссылки обозначают объект - семантическую конструкцию более высокого уровня. Просто как тот.

И учитель уже дал вам ответ в любом случае: A → правильный ответ.

Удачи вам в учебе.