2013-07-07 2 views
0

Независимо от того, при условии удобства ссылок более указателей, таких как безыгольное разыменования и правил, характерных для использования каждого из них,Логическая разница между указателями и ссылками в Go и C++?

есть ли логическая причина, чтобы обеспечить два языковые конструкции, как указатели и ссылки, или это просто синтаксический сахар ?

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

Примечание: вопрос не о правилах определили языками на ссылки, такие как «ссылки не разрешается передавать NULL в C++, но указатели» и т.д.

+0

В C++ ссылка является псевдонимом для объекта. Он выходит далеко за рамки синтаксического сахара: он всегда относится к одному и тому же объекту и не поддерживает арифметику указателя. – juanchopanza

+0

Это звучит как интересный вопрос, но я не могу понять, что вы просите. Как Go и C++ играют роль? Какую именно «разницу» вы ищете? Не могли бы вы прояснить вопрос? –

+0

@ Kerrek Go и C++ включили, чтобы сделать вопрос конкретным, поэтому можно дать конкретные ответы. Кроме того, оба languges имеют одинаковую семантику для ссылок и указателей. – nish1013

ответ

3

Вы задаете два вопроса, если я правильно понимаю

  1. Какая разница между указателями и ссылками
  2. Почему поддерживают оба типа данных

Здесь идет:

  1. Указатель ссылается на место в памяти, где тип данных проживает. Размер указателя фиксирован, учитывая базовое оборудование, обычно 4 или 8 байтов - полностью независимо от того, на что он фактически указывает. Кроме того, указатель может быть передан функции с использованием недопустимого значения - foo(reintepret_cast<int *>(0xDEADBEEF));. Напротив, ссылка гарантирует, что базовые данные действительны - поскольку эта ссылка является псевдонимом самого объекта и не может быть перенесена из этого состояния (предоставление объекта, на который ссылается, по-прежнему находится в области видимости) - , отредактированное за примечание ниже).
  2. Там - причины для поддержки обоих типов. Первая причина заключается в том, чтобы гарантировать, что данные, переданные функциям, действительны - без использования циклов при проверке действительности указателя (не NULL). Вторая причина заключается в том, что можно быть уверенным, что не только данные указывают на допустимое местоположение, но также указывают на действительный объект данных. Но главная причина заключается в том, что эта ссылка позволяет нам пользоваться функцией вызова функции без передачи аргументов по значению, но при этом сохраняя гарантию, что аргумент ссылается на действительное значение.
+0

@levngli. Очень конструктивные ответы, большое спасибо за это. Могли бы вы использовать концепцию «псевдонима» в качестве части этого ответа, чтобы сделать этот ответ более ценным. – nish1013

+0

Несомненно, значение псевдонима состоит в том, что ссылка ссылается на точный объект.Другими словами, если у вас есть такой объект, как 'int foo' и функция с сигнатурой' bar (int & rZog) ', и вы вызываете' bar (foo) ', внутри' bar' - 'rZog' и' foo' одинаковы. Разветвление в том, что изменения в 'rZog' будут действительны в' foo' после выхода из 'bar'. Если 'bar' будет реализован как' void bar (int & rZog) {rZog * = 2;} '; один раз вызываемый '' foo' сам будет умножен на 2. – levengli

+1

«Напротив, ссылка гарантирует, что базовые данные действительны» «Не верно. Если у вас есть ссылка на переменную, которая затем выходит за рамки, она больше недействительна. Если вы передадите эту ссылку, она по-прежнему недействительна. – newacct

0

Вы должны спросить Bjarne Stroustrup, почему у C++ есть ссылки. Среди других мест он объясняет свое обоснование в разделе 7.7 «Ссылки», «Язык программирования на C++», «Четвертое издание» на стр. 189. См. Также стр. 86 «Дизайн и эволюция C++».

+0

Вы могли бы предоставить резюме здесь? – nish1013

Смежные вопросы