LINUX.ORG.RU
Ответ на: комментарий от x0r

И че, совсем никак низя взять референс на чтото в хипе?

CyberK
() автор топика

Точка занимает один символ.

Ссылки можно использовать в шаблонных функциях с move semantics.

anatoly
()

2.Когда функция сохраняет этот указатель куда-либо.

anonymous
()
Ответ на: комментарий от CyberK

это, конечно, хороший финт, но он эквивалентен:

void func(const MyClass * obj)
{
}

MyClass * c = new MyClass;
func(&*c);

и смысла в таких преобразованиях нет.

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

x0r ★★★★★
()
Ответ на: комментарий от x0r

и смысла в таких преобразованиях нет. очевидный минус - это отсутствие nullptr на ссылках.

Это очевидный плюс который запрещает передавать отсутствующий объект. Но по факту это нигде не работает, потому в основном работает как элемент документации.

к тому же передача объекта по ссылке в контейнер ведет к копированию объекта

И это правильно, ибо когда передают объект по ссылке, то предполагают что им попользуются и забудут про него (при этом совершенно не важно где он сам находится - в куче или ещё где-либо). Если уж захотелось его как-то запомнить, то нужно делать либо move, либо copy.

mashina ★★★★★
()
Ответ на: комментарий от x0r

очевидный минус - это отсутствие nullptr на ссылках

Вообще-то это очевидный плюс

Begemoth ★★★★★
()
Ответ на: комментарий от mashina

Но по факту это нигде не работает, потому в основном работает как элемент документации.

пример, пожалуйста. не пойму, о чем речь.

x0r ★★★★★
()
Ответ на: комментарий от x0r

пример, пожалуйста. не пойму, о чем речь.

Можно сделать *ptr, гдe ptr по факту окажется равным nullptr, и узнать об этом только при обращении к ссылке. В каких-то простых случаях компилятор поймёт это на стадии компиляции, а в динамике никаких проверок нет.

mashina ★★★★★
()

Почему иногда поинтеры для передачи данных в функцию лучше?

Лучше они могут быть в двух экзотических случаях: 1) нужно показать, что ссылка не инициализирована (тогда передается nullptr) 2) алгоритм предполагает перезапись аргумента с указателем. Но чаще использование указателей (тем более голых) - признак Си головного мозга.

asaw ★★★★★
()
Ответ на: комментарий от x0r

очевидный минус - это отсутствие nullptr на ссылках.

Это одновременно и очевидный плюс. То есть мы явно говорим, что валидное значение.

DarkEld3r ★★★★★
()

Почему иногда поинтеры для передачи данных в функцию лучше?

Потому что они никогда не лучше. Забудь про сырые указатели вообще.

mix_mix ★★★★★
()

Правило простое: Если не надо чего-то непременно требующего указатели, то используй ссылки.

invy ★★★★★
()
Ответ на: комментарий от x0r

потому, что ссылки ссылаются только на объекты на стеке?

4.2

pon4ik ★★★★★
()

Что за бред я только что прочитал в каментах? o_O Всем вон из профессии!!!1 А еще говорят мне что цпп не говно.

Главный зашквар ссылок — их нельзя переопределить, тоесть указывать они могут только на 1 объект. А указатели можно. Зачем использовать ссылки? Мозг обезьянок от цпп просто отказывается осиливать уберсложнейший синтаксис указателей, лол.

unt1tled ★★★★
()
Последнее исправление: unt1tled (всего исправлений: 1)
Ответ на: комментарий от CyberK

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

int f(vector<int> *data) {
  return (*data)[0] + (*data)[1];
}

int f1(const vector<int> &data) {
  return data[0] + data[1];
}
feel the difference

А когда тебе понадобится указатель - ты поймешь (и да, в этом случае скорее всего надо будет передавать shared_ptr) :)

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 2)
Ответ на: комментарий от invy
AtomicReference<List<String>> data = new AtomicReference<List<String>>();

List<String> tempList = new ArrayList<String>();
tempList.add("зажрались вы совсем, барин!");
tempList.add("сложно звездочку написать!");
tempList.add("авось AtomicReference то проще писать, да?!");

data.set(tempList);

public static String f1(AtomicReference<List<String>> data) throws IllegalArgumentException {
  boolean valid = false;
  String result = "";
  if (null != data) {
    List<String> tempList = data.get();
    if (null != tempList) {
      String elem1 = tempList.get(0);
      String elem2 = tempList.get(1);
      if (null != elem1 && null != elem2) 
        result = elem1+elem2;
        valid = true;
      }
    }      
  }
  if (true == valid) {
    return result;
  } else {
    throw new IllegalArgumentException();
  }
}

try {
  String result = f1();
  System.out.println(String.format("Результат: ", %s));
} catch (IllegalArgumentException e) {
  System.out.println("Мда, фигня какая-то");
  e.printStackTrace();
}
stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от x0r

Зачем вводить людей в заблуждение? Не знаешь - пройди мимо. Или послушай тех, кто знает.

anonymous
()
Ответ на: комментарий от unt1tled

Зачем использовать ссылки? Мозг обезьянок от цпп просто отказывается осиливать уберсложнейший синтаксис указателей, лол.

Нет, просто Страуструп не придумал лучше способа передачи объектов для перегрузки операторов.

anonymous
()

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

anonymous
()
Ответ на: комментарий от invy

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

anonymous
()

Ссылки — это такой синтаксический сахар для указателей, находящийся в русле общего стремления C++ не давать программисту понять WTF is going on.

Miguel ★★★★★
()
Ответ на: комментарий от anonymous

Единственный нормальный коммент на весь топик

vzzo ★★★
()
Ответ на: комментарий от Miguel

Ссылки — это такой синтаксический сахар для указателей

Вранье. Указатели - всего лишь возможная реализация ссылок.

anonymous
()
Ответ на: комментарий от anonymous

Вранье. Указатели - всего лишь возможная реализация ссылок.

Фигня. Указатели - это одна их низкоуровневых основ языка. Простой пример - для указателей доступны арфиметические операции, и они очевидно не доступны для ссылок.

Ссылки - синтаксический сахар для передачи параметров в функции и перегрузки операторов. В последнем случае ссылки необходимы, но это проблема скорее синтаксиса.

Сам Страуструп, например, предлагает рассматривать реализацию ссылок через константный указатель.

ТС, читай: http://www.lib.ru/CPPHB/cpptut.txt#47

anonymous
()
Ответ на: комментарий от unt1tled

Главный зашквар ссылок — их нельзя переопределить, тоесть указывать они могут только на 1 объект.

Всем вон из профессии!!!

/0

uvv% cat test.cpp
#include <iostream>

int main(int argc, char** argv)
{
   int a = 1;
   int b = 2;
   int &r = a;
   std::cerr << "r = " << r << std::endl;
   r = b;
   std::cerr << "r = " << r << std::endl;
}
uvv% ./test
r = 1
r = 2
UVV ★★★★★
()
Последнее исправление: UVV (всего исправлений: 2)
Ответ на: комментарий от conalex

Да понял уже. Перепутал с указателем =)

UVV ★★★★★
()

Почему иногда поинтеры для передачи данных в функцию лучше?

а кто так говорит? в смысле откуда ты это взял? расшифруй, когда - иногда, почему лучше?

я думал, что ссылки - для мелочи на стеке (ну и там всякие заморочки с перегрузкой), указатели - для объектов в куче. но разницы для передачи в функции не улавливаю.

conalex ★★★
()
Ответ на: комментарий от anonymous

Указатель - понятие низкого уровня, ссылка - высокого, нефиг их смешивать. У ссылок семантическая нагрузка выше.

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.