LINUX.ORG.RU

про ссылочные типы в C++


0

0

Вопрос несколько идеологичен...
Вот объясните мне зачем в С++ ввели ссылочный тип данных.
Не надо тока меня к умным книгам отсылать.
Да понятно удобно в функции-члены передавать.
А вот например возврат из метода по ссылке?
В методе треба при этом динамически распределить возвращаемое значение - так class_name *A = new class_name(...)
и возвратить return *A.
Ecли создавать как class_name A(...)
То ессно ничего не выйдет(при возврате по ссылке)...
Пусть для классов написана некая функция, возвращающаяя результат по ссылке.
class classname
{
....
    classname& G(); 
....
}
Где нибудь в проге пишем
classname A(...);
for(int i=0;i<10000000;i++)
              A.G();
Все замечательно ломается...
Ну понятно -память течет... так как возвращаются в нирвану ссылки на динамически распределенные в функции G объекты...
При этом программа не ломается, а просто кушает память... Система уходит в SWAP...
А так нет.
classname *B;
classname A(....);
for(int i=0;i<10000000;i++)
{
           B=&(A.G());
           delete B;   
}

Ну конечно все работает....
Вопрос: С этим бороться довольно тяжело, и все равно приходится прибегать к помощи указателей....
Согласен, что когда в проге 3-4 экземпляра класса то все ОК.
А когда куча динамических данных+куча экзкмпляров(вычисления на классах).
В принципе проблема решается... но зачем оно надо?
Вот в Java сделано умно'. Нет ссылки - удаляем... 


anonymous

Ну, прежде всего, я не очень понял некоторые фразы, как-то:
"Память течет", "Система уходит в SWAP" и "Возвращаются
в нирвану ссылки на динамически распределенные в функции объекты".
Объяснись.

По существу.
Никто никогда не возвращает ССЫЛКУ на объект, созданный в
heap. Это просто глупо. Возвращают указатель. 
Ссылку (обычно константную) полезно возвращать из метода типа
get() на объект-член класса. Примерно так:

class my {
public: 
   const classname & get() const { return member1; }
   const string & get_name() const { return name; }
private:
   classname member1;
   string name;
};

В классах типа vector можно возвращать неконтантную ссылку на 
элемент-член:

class vector {
public:
   type & operator[](int i) { assert(...); return data[i]; }
   const type & operator[](int i) const { assert(...); return data[i]; }
private:
   type * data;
}

Этим, конечно, список применений не исчерпывается. Есть
куда более тонкие моменты, чем те, что я описал.

А с Java сравнивать это нельзя. Язык С++ и Java предназначены
для разных типов задач и говорить, что "в Java сделано умно",
а в С++ - нет, просто неумно.

JekLove
()

конечно, понятно что в случаях подобных классам ostream(или как там его) гораздо удобнее работать с ссылками. Такие моменты, о которых вы говорите мне очень даже понятны. Конечно если возвращать сложные типы данных, то только по ссылкам. Иначе эффективность теряется(памяти слишком много копируется). То, что на heap данные ссылки не возвращаются(в смысле не следует возвращать) тоже в понятно почему, но... если за тебя написали уже мноооогггоо кода где так все и делается именно. А приходится исправлять все утечки памяти. Так вроде все ок. но начинаешь в циклах гонять весь ОК летит в .... Насчет Java: Слушай. Ну разве нелогично то что ссылка не присвоенная ни к чему должна удаляться после того что у нее там справа выполнится??? По моему логично... А насчет НЕУмно я не говорил...

anonymous
()

Логично-нелогично - не в этом соль. Соль в том, что схемы автоматических сборщиков мусора работают медленно, в С++ все это можно сделать своими руками, но он ничего не навязывает, поэтому программы на С++ очень быстры, а на яве - медленны.

JekLove
()

Не, погоди, извини, если задел. Мне просто интересно, почему ты применял такие странные выражения... Расскажи :-)

JekLove
()

В каком месте рассказать? пиши на ikmrachniy@mail.ru

anonymous
()

да тут рассказывай, всем интересно...

а про сборщиков мусора итп так имхо все подчинено девизу "если фича вам не нужна, она не должна вам мешать" (С) Страуструп.

в частности поэтому в ++ можно много и быстро выделять/освобождать, а в яве --- нет, хоть она и кое-где местами на простой арифметике сравнивается с ++.

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