Зачем объявлять постоянный указатель, используя ключевое слово const, когда ссылка (указатель const) доступна? - PullRequest
0 голосов
/ 06 декабря 2011

Например:

Я мог бы создать постоянный указатель, который указывает на объект, который я могу изменить с помощью моего указателя.Указатель не может быть переназначен:

MyObj const *ptrObj = MyObj2 

Зачем мне использовать это:

MyObj &ptrObj = MyObj2

Ответы [ 3 ]

4 голосов
/ 06 декабря 2011

То, что у вас есть, это не указатель const, это указатель на объект const - то есть указатель можно изменить, но объект нельзя.Указатель const будет выглядеть следующим образом:

MyObj *const ptrObj = &MyObj2;

Что касается того, почему вы предпочитаете его ссылкам, вам может потребоваться гибкость использования специального значения NULL для чего-либо - вы этого не получитесо ссылкой.

2 голосов
/ 06 декабря 2011

Вы ошиблись. У вас есть изменяемый указатель на константу объект:

T const * p;
p = 0;            // OK, p isn't const
p->mutate();      // Error! *p is const
T const & r = *p; // "same thing"

Что вам действительно нужно, так это константа указатель на изменяемый объект:

T * const p = &x; // OK, cannot change p
T & r = x;        // "same thing"
p->mutate();      // OK, *p is mutable

Действительно, ссылки морально эквивалентны константным указателям, т.е. T & против T * const и константной версии T const & против T const * const.

Если вы настаиваете на том, чтобы получить какой-то совет, тогда я бы сказал: «Не используйте указатели».

1 голос
/ 06 декабря 2011

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

Способность указателей ссылаться на объекты от 0 до n означает, что указатель является более гибким в том, что он может представлять.Когда дополнительная гибкость указателя не требуется, обычно лучше использовать ссылку.Таким образом, кто-то, читающий ваш код, не должен определять, ссылается ли указатель на ноль, один или n объектов.

...