Какая разница между передачей по указателю и по ссылке?

Есть базовый класс A.
Есть функция bool foo(A &qw, A *qw2)
Какая разница, что передавать в функцию, ссылку на объект класса, или указатель на объект класс.
В первом случае обращение получается qw.xx, а во втором qw2->xx.
Поясните, пожалуйста в чем разница. И как более правильно.
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
О передаче объекта в функцию — обычно ссылка, НО!

1. Если библиотека живёт на указателях (Qt) — указатель.
void fillCombo(QComboBox* x) {}  // хорошо
fillCombo(ui->comboHistory);

void fillCombo(QComboBox& x) {}  // плохо
fillCombo(*ui->comboHistory);


2. Если возможен NULL — указатель. НО: существует паттерн «Null object», и он иногда бывает хорош.
// Хуже, но возможно
void import(AsyncRunner* asy) {
   if (asy) {
      asy->run([](){
        doImport(x);
      });
   } else {
      doImport(x);
   }
}
import(nullptr);

// Лучше
void import(AsyncRunner& asy) {
  asy.run([](){
    doImport(x);
  });
}
import(NoAsync::INST);


3. Если передаём буфер данных — указатель.
void write(size_t size, const char* data) {}

4. Если объект невелик — значение.
void save(std::string_view fileName) {}

Объект может быть велик, но для него существуют специальные регистры — тогда…
void transform(Matrix4 x) {}
Есть одна машина с такими регистрами, не помню только, какая. Xbox?

5. Идиома «by value + move», позволяющая избавиться от двух версий функции — Obj(string&) и Obj(string &&). Используется для объектов с простым перемещением и сложным копированием — обычно строк и структур STL.
Obj::Obj(std::string aName) : name(std::move(aName)) {}
Ответ написан
Комментировать
zagayevskiy
@zagayevskiy
Android developer at Yandex
Указатель может быть nullptr (не указывать ни на что). Ссылка не может быть неинициализированна.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы