Типы указателя и ссылки - PullRequest
14 голосов
/ 19 октября 2011

Я пытаюсь придумать конкретную причину, почему использовать указатель на ссылку в качестве типа возврата из функции,

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

  int& something(int j)
  {
      int* p = 0 ;  
      return *p;
  }

  void main()
  {
      int& i = something(5);
      i = 7;   // run-time error 
  }

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

 void main()
 {
         int* i = something(5);
         if( i != null )
             *i = 7;
 }

любые мысли будут оценены снова,

что бы вы использовали и почему ссылка или указатель

заранее благодарны.

Ответы [ 6 ]

20 голосов
/ 19 октября 2011

Вы можете использовать указатель вместо ссылки, если:

  • Нулевое допустимое возвращаемое значение
  • Вы динамически создали что-то в функции, и получатель становится владельцем.(В этом случае вы можете рассмотреть возврат интеллектуального указателя, такого как std :: auto_ptr или boost :: shared_ptr.)

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

8 голосов
/ 19 октября 2011

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

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

Сравните это с указателем. Указатель может быть НЕДЕЙСТВИТЕЛЕН, и вызывающей стороне придется иметь дело с возвращаемым значением НУЛЬ. Поэтому, если ваша функция не может гарантировать, что она вернет действительную ссылку, и вы не хотите генерировать исключения, вам нужно будет использовать указатели.

2 голосов
/ 19 октября 2011

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

Сказав это, историческое соглашение состоит в том, чтобы возвращать объекты кучи через указатели, даже если они гарантированно ненуль.

1 голос
/ 19 октября 2011

Если ваша функция «всегда» возвращает значение, то ваша функция должна возвращать ссылку.

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

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

1 голос
/ 19 октября 2011

C ++ ссылки не могут быть нулевыми.Ошибка - разыменование нулевого указателя.Это неопределенное поведение.

0 голосов
/ 19 октября 2011

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

Указатель возврата - вызывающей стороне принадлежит память (и очистка)

Справка - Callee владеет памятью. НЕ возвращайте динамически распределенную точку, если вызываемый не управляет ею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...