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

312
03 апреля 2018, 00:27

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

Answer 1

Еще отличия:

  1. Нельзя объявить массив ссылок.
  2. У ссылки нет адреса.
  3. Существует арифметика указателей, но нет арифметики ссылок.
  4. Указатель может иметь «невалидное» значение с которым его можно сравнить перед использованием.

    Если вызывающая сторона не может не передать ссылку, то указатель может иметь специальное значение 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.

  5. Ссылка не обладает квалификатором const

    #include <iostream>
    int main()
    {
        std::cout << "Hello, world!\n";
        const int v = 10;
        //int& const r = v; // Ошибка
        const int& r = v;
        enum
        {
            is_const = std::is_const<decltype(r)>::value
        };
        if(!is_const)
            std::cout << "const int& r is not const\n";
        else
            std::cout << "const int& r is const\n";
    }

О весёлом

Некоторые ссылаются на отрывок с интервью с Страуструпом:

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

Другие задают в ответ лишь в один вопрос:

Чем является реультат разыменовывания указателя?

На тему, нужно ли знать отличия указателя от ссылки, писал Джоэл Спольски в своей статье «Закон Дырявых Абстракций».

Answer 2

Принципиальных отличий два:

  • ссылка, в отличии от указателя, не может быть неинициализированной;
  • ссылка не может быть изменена после инициализации.

Отсюда и получаем плюсы и минусы использования того и другого:

  • ссылки лучше использовать когда нежелательно или не планируется изменение связи ссылка → объект;
  • указатель лучше использовать, когда возможны следующие моменты в течении жизни ссылки:
    • ссылка не указывает ни на какой объект;
    • ссылка указаывает на разные объекты в течении своего времени жизни.
READ ALSO
При определении одной и той же переменной в разных функциях код стопорится | Arduino c++

При определении одной и той же переменной в разных функциях код стопорится | Arduino c++

Вчера победил многозадачность в Arduino и решил не делать 4 переменные 2 из которых копия других 2Засунул одинаковые переменные в разные функции

185
Как настроить QT creator в Mint Linux

Как настроить QT creator в Mint Linux

Здравствуйте, нужно для лабораторных писать ПО под LinuxПоставил на Virtual Box Mint(писали что он лучше всего для новичков подойдет)

212
Использование friend funtions в С++

Использование friend funtions в С++

Здравствуйте, изучаю вот OpenGL, и наткнулся на совсем мне непонятную проблему, вот код:

304
Составить программу в C++ [требует правки]

Составить программу в C++ [требует правки]

Даны действительные числа х, у, zПолучить: a) max(x,y,z); b)min(x,y,z), max(x,y,z)

242