trinitr0
@trinitr0
провинциальный админ

Можно ли считать константный указатель аналогом ссылки в С++?

Здравствуйте!
К примеру константный указатель:
*const Cat
и ссылка:
&Cat

Можно ли считать эти способы обращения к объекту аналогичными и взаимозаменяемыми?
  • Вопрос задан
  • 295 просмотров
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Нет, но разница более существенная, чем возможность присвоить nullptr. Константной ссылкой можно удлинить время жизни временного объекта, а указателем -- никаким нельзя.
Например так можно:
T f();
...
const T& obj = f();
obj.foo();

-- объект вернувшийся из функции f не будет разрушен до выхода obj из области видимости.

А так -- нельзя:
T f();
...
const T* const obj = &(f());
obj->foo();

-- этот код даже не скомпилируется, поскольку тут берётся адрес временного объекта.
Ответ написан
Комментировать
@Alexander1705
Специально провёл эксперимент:

1. Пишем две аналогичных программы: одна с использованием указателей, другая - ссылок.
ptr.cpp
#include <iostream>


using namespace std;


void foo(int* x) {*x = 7;}


int main(int argc, char** argv)
{
    int x = 0;
    foo(&x);
    cout << x << endl;
    return 0;
}

ref.cpp
#include <iostream>


using namespace std;


void foo(int& x) {x = 7;}


int main(int argc, char** argv)
{
    int x = 0;
    foo(x);
    cout << x << endl;
    return 0;
}

2. Компилируем в ассемблерный код.
g++ -S ptr.cpp
g++ -S ref.cpp


3. Проверяем, есть ли разница.
diff ptr.s ref.s

У меня linux, gcc 5.3.0. Файлы отличаются только именами функций (Z3fooRi у ссылок, Z3fooPi у указателей). То есть, в данном случае действительно нет разницы между ссылками и указателями.

P. S. Этот эксперимент показывает лишь то, что нет разницы между передачей по ссылке и по указателю. В случае, который указали в других ответах, разница есть.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg Куратор тега Программирование
Любые ответы на любые вопросы
Нет. В указатель можно засунуть nullptr, а в ссылку - нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы