Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: [c++] reference  (Прочитано 20321 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 20-07-2009 15:43 » 

[c++] reference

если
class Ray {  ..... };
Ray& f(void) { ..... };

то  в чем разница между строками
Ray &a =f();
и
Ray b=f();

?

Записан

1n c0de we trust
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 20-07-2009 20:16 » 

В том, что во 2м случае будет вызван конструктор копирования для Ray, который создаст ещё один экземпляр Ray и скопирует туда значение.
Ссылка, я надеюсь, не на временный объект возвращается?
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #2 : 21-07-2009 12:43 » 

Ссылка, я надеюсь, не на временный объект возвращается?

а шут его знает, я еще документацию не открывал и в этой части глубоко в код не лазил  ... скорее всего ссылка возвращается на член синглетона или одного из объектов контейнера

Записан

1n c0de we trust
Mayor
Специалист

ru
Offline Offline

« Ответ #3 : 25-07-2009 06:09 » 

а для чего обычно используется такая конструкция:

typedef int (&pf)(int,int);

какие у нее приемущества над или в каких случаях она заменяет:

typedef int (*pf)(int,int);
Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 25-07-2009 17:37 » 

ссылка на функцию  и указатель на функцию )

Применяются абсолютно одинаково. Разница только в том, что ссылке сразу нужно присвоить значение, а указателю можно и потом
Записан

Mayor
Специалист

ru
Offline Offline

« Ответ #5 : 25-07-2009 17:43 » 

ссылка на функцию  и указатель на функцию )
Применяются абсолютно одинаково. Разница только в том, что ссылке сразу нужно присвоить значение, а указателю можно и потом

те я могу изменить значение ссылки из другой части программы, а указатель на функцию всегда будет локальным?
Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 25-07-2009 20:51 » 

Цитата
те я могу изменить значение ссылки из другой части программы,
значение ссылки поменять нельзя нигде

Цитата
а указатель на функцию всегда будет локальным?
где объявишь, таким и будет ))
Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 26-07-2009 15:59 » 

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

ru
Offline Offline

« Ответ #8 : 26-07-2009 17:31 » 

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

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

или ты имеешь ввиду, если я получил указатель на функцию, то он будет действителен до разрушения стека или кучи в котором он находится, а ссылку может обнулить или подменить любая асинхронная подсистема еще до разрушения локальных переменных функции в которой получена ссылка?

Записан

1n c0de we trust
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 26-07-2009 19:10 » 

Куда это ты ссылку обнулять собираешься? Можно испортить память, на которую ссылаются или указывают (в том числе, при разворачивании стека). Но на момент создания ссылки она связана с объектом. Если кто-то создаёт ссылку на разыменованный null-ptr - тот сам себе враг. Но модифицировать значение ссылки на функцию или код функции по указателю - как ты это себе видишь?
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 27-07-2009 04:00 » 

1. Работая с указателем ты работаешь с ним, так как будто это переменная содержит адрес интересующего объекта, т.е. для получения доступа к самому объекту ты выполняешь определённые манипуляции
2. Ссылка по сути указатель, НО ведёт себя так, как будто это просто локальный объект, как следствие она должна быть проинициализирована при определении.

Учи мат.часть
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #11 : 27-07-2009 10:25 » 

как ты это себе видишь?

абстрактно: имеется гуй объект, при его активации вызывается связаная с ним процедура

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

при получении ссылки на функцию, другие подсистемы смогут дезактивировать этот элемент, изменить логику его работы в зависимости от условий, или попросту поставить хук - немного напоминает функции высшего порядка из ФП, хотя я еще не видел где это можно использовать

а насчет, обнуления ссылки - действительно плохая идея ...

может быть ссылка удобнее указателя для реализации конечного автомата?


Записан

1n c0de we trust
Mayor
Специалист

ru
Offline Offline

« Ответ #12 : 27-07-2009 10:26 » 

1. Работая с указателем ты работаешь с ним, так как будто это переменная содержит адрес интересующего объекта, т.е. для получения доступа к самому объекту ты выполняешь определённые манипуляции
2. Ссылка по сути указатель, НО ведёт себя так, как будто это просто локальный объект, как следствие она должна быть проинициализирована при определении.
Учи мат.часть

это все уже читал, тут идет речь об обычных переменных, а меня интересуют прецеденты работы с функциями
Записан

1n c0de we trust
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 27-07-2009 10:39 » 

Основное отличие ссылки от указателя - в том, что указатель можно модифицировать. Не объект, на который ссылаются, а саму ссылку - переназначить на другой объект/функцию. Если тебе нужно в какой-то момент заменить функцию, на которую ты ссылаешься, то с указателем тебе это удастся сделать, а со ссылкой - нет. Поэтому ссылка - более константный объект. Можешь полагать её константным указателем.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #14 : 27-07-2009 11:19 » 

Поэтому ссылка - более константный объект. Можешь полагать её константным указателем.

если бы ее полагали константным объектом то навреное было бы что то типа:

typedef int (const  &pf)(int,int) ; // ?

ладно, в общем чем дальше в лес, тем больше дров: я думаю следует поискать примеры из реально используемых приложений или библиотек
Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 27-07-2009 11:27 » 

Mayor, ссылка на константу и просто ссылка - это разные типы для компилятора. Фактически, это одно и тоже, но он не позволит присвоить ссылке int& значение переменной const int
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #16 : 27-07-2009 11:31 » 

это все уже читал, тут идет речь об обычных переменных, а меня интересуют прецеденты работы с функциями

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

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #17 : 27-07-2009 12:48 » 

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

приехали, теперь ты будешь говорить, что нет никакой разници если мы получим из функции ссылку или указатель ?
Записан

1n c0de we trust
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 27-07-2009 13:00 » 

Mayor, чтобы все говорили на одном языке
дай свое понимание
ссылки и указателя
reference & pointer

Или Указатель != pointer ?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #19 : 28-07-2009 05:19 » 

приехали, теперь ты будешь говорить, что нет никакой разници если мы получим из функции ссылку или указатель ?

почти ни какой, разница в том, как ты потом это используешь, но это не зависит от того, как ты вернул результат
стандарт предоставляет ГИГАНТСКУЮ выразительную мощность, что хочу то и делаю, для компилятора, что ссылка, что указатель почти одна хрень, синтаксис немного разный

Код:

T * f1();
T & f2();

int main()
{
   T * t = f1();
   T & t2 = *f1();
   T * t3 = &(f2());
   T & t4 = f2();
}

у ссылки главное приемущество это синтаксис и требования к обязательной инициализации, но при желании всё можно изгадить
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #20 : 28-07-2009 12:42 » 

почти ни какой, разница в том, как ты потом это используешь, но это не зависит от того, как ты вернул результат
стандарт предоставляет ГИГАНТСКУЮ выразительную мощность, что хочу то и делаю, для компилятора, что ссылка, что указатель почти одна хрень, синтаксис немного разный
Код:
T & f2();
у ссылки главное приемущество это синтаксис и требования к обязательной инициализации, но при желании всё можно изгадить

посути прикольное решение T & f2();  - фактически это можно использовать как патерн контролирующий порядок инициализации глобальных переменных в разных модулях, до этого я использовал ссылки только в :
передаче константных параметров в функцию void f(const type1& r);
и удобства синтаксиса самопальных мап: type1& operator[](const type2&)
/* map1<string a,int b>  x;
x["lalala"]++;
*/

а теперь перейдем от ссылок на объекты к ссылкам на функции:
( возможно перед этим правда стоит почитать про функции высшего порядка из ФП)
typedef int (&pf1)(int,int);
typedef int (*pf2)(int,int);

struct a {
pf2 b;
void f1(pf2 c) { b=c };
void f2(void) { b(1,2) };
}

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

теперь если заменим pf2 на pf1 - получается, что ряд объектов независимо от их класса оказался повязан функцией передающей ему ссылку  и любой из них может изменить логику поведения всех остальных просто изменив ссылку

я вот только в последнем случае не представляю выльется ли это в патерн или станет антипатерном
« Последнее редактирование: 28-07-2009 13:02 от Mayor » Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 28-07-2009 15:55 » 

Mayor, как-то ты ударяешься в дебри, не задумываясь о том, что это может никогда и не пригодиться. Сначала надо ставить задачу, а потом искать решение, а не наоборот - придумывать сложные решения, не зная ещё, куда всё это засунуть, а ещё и мучительно стараться всё это применить ))
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #22 : 29-07-2009 04:19 » new

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

Алексей1153++, поддерживаю Улыбаюсь как-то помнится начитался Александреску Улыбаюсь лучше бы я не писал тот код, от жестоко изощрённый: шаблоны, свойства, политики, pImpl и всё это нахрен не нужно Улыбаюсь
Записан

Странно всё это....
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 29-07-2009 06:20 » 

LogRus, не согласный: конечно, после Александреску код поначалу становится совсем диким, но в целом, многие практики оказываются полезными, если их применять по месту. Просто в самом начале нужно переболеть привычкой лепить всё увиденное где попало.
И ещё, стоит поверх почитать "Решение сложных задач" Саттера, чтобы увидеть, что шаблоны тоже не везде и не со всех точек зрения удобны (но pImpl по-прежнему на коне Улыбаюсь )
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #24 : 29-07-2009 06:29 » 

.....но pImpl по-прежнему на коне Улыбаюсь .........

Без сомнений, величайшее изобретение Улыбаюсь
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 29-07-2009 06:32 » 

я применил пару раз пимпл, ещё не зная, как это называется Улыбаюсь)
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines