Страницы

Поиск по вопросам

понедельник, 1 октября 2018 г.

Чем отличаются ссылки от указателей в С++

В чем принципиальное отличие ссылки от указателя в С++? Когда лучше использовать ссылку, а когда указатель? Какие ограничения есть у первых, а какие у вторых?


Ответ

Еще отличия
Нельзя объявить массив ссылок. У ссылки нет адреса. Существует арифметика указателей, но нет арифметики ссылок. Указатель может иметь «невалидное» значение с которым его можно сравнить перед использованием.
Если вызывающая сторона не может не передать ссылку, то указатель может иметь специальное значение nullptr
void f(int* num, int& num2) { if(num != nullptr) // if nullptr ignored algorithm { } // can't check num2 on need to use or not }
http://rextester.com/EQMC52074
(Standart) A null pointer constant is an integer literal (2.13.2) with value zero or a prvalue of type std::nullptr_t. A null pointer constant can be converted to a pointer type; the result is the null pointer value of that type and is distinguishable from every other value of object pointer or function pointer type. Ссылка не обладает квалификатором const
#include int main() { std::cout << "Hello, world!
";
const int v = 10; //int& const r = v; // Ошибка const int& r = v;
enum { is_const = std::is_const::value };
if(!is_const) std::cout << "const int& r is not const
"; else std::cout << "const int& r is const
"; }
О весёлом
Некоторые ссылаются на отрывок с интервью с Страуструпом:
Очевидной реализацией ссылки является (константный) указатель, при каждом использовании которого происходит разыменование. В некоторых случаях компилятор может оптимизировать ссылку таким образом, что во время исполнения вообще не будет существовать объекта, представляющего ссылку.
Другие задают в ответ лишь в один вопрос:
Чем является реультат разыменовывания указателя?
На тему, нужно ли знать отличия указателя от ссылки, писал Джоэл Спольски в своей статье «Закон Дырявых Абстракций».

Комментариев нет:

Отправить комментарий