Различие между указателем константы и ссылкой?

Каково различие между постоянным указателем и ссылкой?

Постоянный указатель как имя подразумевает, не может быть связан снова. То же имеет место со ссылкой.

Интересно в том, какие сценарии были бы один быть предпочтенными по другому. Как отличающийся действительно ли их C++ является стандартным и их реализации?

аплодисменты

39
задан Arnkrishn 25 February 2010 в 17:40
поделиться

4 ответа

Есть 3 типа константных указателей:

//Data that p points to cannot be changed from p
const char* p = szBuffer;

//p cannot point to something different.  
char* const p = szBuffer;

//Both of the above restrictions apply on p
const char* const p = szBuffer;

Метод № 2 выше больше всего похож на ссылку.

Между ссылками и всеми тремя типами константных указателей, указанных выше, есть ключевые различия:

51
ответ дан 27 November 2019 в 02:37
поделиться

Я предполагаю, что вы имеете в виду константный указатель (например, int * const ptr), а не указатель на const (например, int const * ptr).

  • Отсутствие инициализации ссылки является ошибкой компиляции (позволяет избежать проблемы неинициализированных указателей)
  • Указатель также может указывать на массив или иметь значение NULL, где ссылка всегда относится только к одному объекту.
  • Синтаксис сильно отличается
7
ответ дан 27 November 2019 в 02:37
поделиться

Некоторые различия:

Указатель const может указывать на NULL.

Константный указатель может указывать на массив объектов.

Константный указатель может быть связан снова путем отбрасывания константности.

0
ответ дан 27 November 2019 в 02:37
поделиться

Когда следует использовать каждый:

ссылка: Используйте их по умолчанию. Очень часто люди разыменовывают NULL-указатели. Вы устраняете этот риск с помощью ссылки.

const pointer: Когда вам нужна ссылка, но вы не можете ее создать. Например, вы пишете драйвер, и вам нужен указатель на начало карты памяти. В этом случае ссылка не имеет особого смысла. Также, если вам нужен массив вещей, ссылка не подойдет (хотя массив простых классов со ссылочными членами подойдет).

В следующем примере указатель const проверяет ошибку, которую не может проверить ссылка:

int addFour( int* register ){
  if(isNull(arg)){
    throw NullPointerException();
  }  

  // some stuff
  *register += 4;

  return register;
}

// This could be any function that does pointer math.
bool isNull(const int* ptr){
  return( NULL == ptr );
}
6
ответ дан 27 November 2019 в 02:37
поделиться
Другие вопросы по тегам:

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