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

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

Q: Каково различие между указателем C++ и ссылкой?

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 является корректным, и что ссылка на объект является, на самом деле, самим объектом. Это корректно? Я понимаю, что доступ к ссылке эквивалентен доступу к самому объекту, однако, при разрушении ссылки, мы не разрушаем сам объект. Ссылка является альтернативным названием объекта, но говорящий что ссылка == верный объект?

BTW, лектор дал следующую ссылку на часто задаваемые вопросы как поддержка его требования, кавычки:

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

Но тем не менее, я полагаю, что это неправильно.

15
задан seaotternerd 23 February 2015 в 06:30
поделиться

10 ответов

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

РЕДАКТИРОВАТЬ: Краткое доказательство того, что (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
5
ответ дан 1 December 2019 в 00:05
поделиться

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

Но в настоящее время даже студенты CS, кажется, обманывают все с ложечки и проверяют эти «знания» с помощью почти невозможных провалить тесты, подобные тому, который цитируется OP.

Угу !!!

4
ответ дан 1 December 2019 в 00:05
поделиться

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

0
ответ дан 1 December 2019 в 00:05
поделиться

Все ответы неверны, A является наиболее близким.

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

1
ответ дан 1 December 2019 в 00:05
поделиться

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

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

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

-1
ответ дан 1 December 2019 в 00:05
поделиться

Они все неправы.

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

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

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

37
ответ дан 1 December 2019 в 00:05
поделиться

Существует различие между ссылкой и объектом - вы можете иметь несколько ссылок на один и тот же объект. У объекта есть «идентичность», а у самой ссылки - нет.

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

7
ответ дан 1 December 2019 в 00:05
поделиться

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

  • Ссылка как выражение
  • Сама ссылка

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

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

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

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

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

3
ответ дан 1 December 2019 в 00:05
поделиться

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

#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;
}
1
ответ дан 1 December 2019 в 00:05
поделиться

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

1
ответ дан 1 December 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: