Russian Qt Forum
Апрель 26, 2024, 09:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: ссылки\указатели  (Прочитано 10868 раз)
alexeyvanzhula
Гость
« : Ноябрь 24, 2014, 00:14 »

Объявление, к примеру, QLabel
explicit QLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0);
Если ссылки исользуються для удобства, почему в таком объявлении одновременно и тип указатели и ссылочный.
В чем профит от использования внутри функции QString-a по ссылке, а parent-a по указателю ?
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Ноябрь 24, 2014, 00:21 »

здесь частично объясняется (касательно Qt):
http://qt-project.org/wiki/API-Design-Principles
Записан
alexeyvanzhula
Гость
« Ответ #2 : Ноябрь 24, 2014, 04:22 »

Спасибо. Все что я тут вижу по ссылкам, так это то что разрабы рекомендуют пользоваться указателями а не ссылками, потому что они удобнее для чтения.
Почему же QString принимают по ссылке (в описании нативных классов) ?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Ноябрь 24, 2014, 05:32 »

Объявление, к примеру, QLabel
explicit QLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0);
Если ссылки исользуються для удобства, почему в таком объявлении одновременно и тип указатели и ссылочный.
В чем профит от использования внутри функции QString-a по ссылке, а parent-a по указателю ?

Параметр text в конструкторе передается по ссылке и его нельзя менять.
Указатель же, может быть необязательным и в тоже время если его передать, может быть изменен внутри конструктора.
Записан

alexeyvanzhula
Гость
« Ответ #4 : Ноябрь 24, 2014, 05:58 »

хорошо. читаю вот примеры (официальные):
1. void addPiece(QPixmap pixmap, QPoint location);
2. const QRect targetSquare(const QPoint &position) const;

Почему объявления 1 и 2 просят разные типы QPoint?
И почему QRect константная функция? Что это дает?
« Последнее редактирование: Ноябрь 24, 2014, 06:01 от alexeyvanzhula » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Ноябрь 24, 2014, 06:55 »

1.
Потому что так написали разработчики и им надо бы задавать этот вопрос Улыбающийся

2.
http://msdn.microsoft.com/ru-ru/library/6ke686zh.aspx
Цитировать
Константные функции-члены

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

sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 870


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #6 : Ноябрь 24, 2014, 09:14 »

В 1 производится передача по значению. Т.е. в функцию передается не сам объект, а его копия. Для этого используется конструктор копирования. Либое изменение объекта внутри функции не скажется на передаваемом объекте.
Это нормально, если объект маленький и, к примеру, не содержит указателей, на которых висят динамические объекты. Для больших объектов накладные расходы на копирование могут оказывать влияние на эффективность программы.
в 2 передается константная ссылка на объект. Здесь не производится никакого копирования, т.е. безопасно с точки зрения дублирования содержимого объекта, и эффективно с точки зрения накладных расходов на копирование. Попытку изменения объекта внутри функции контролирует компилятор.
Как сделать - дело вкуса и решается в конкретном случае.
Надо только помнить, что ссылка - это альтернативное имя объекта, она инициализируется при объявлении и не может быть изменена, в отличие от указателя.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
vulko
Гость
« Ответ #7 : Ноябрь 24, 2014, 09:30 »

Объявление, к примеру, QLabel
explicit QLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0);
Если ссылки исользуються для удобства, почему в таком объявлении одновременно и тип указатели и ссылочный.
В чем профит от использования внутри функции QString-a по ссылке, а parent-a по указателю ?

Параметр text в конструкторе передается по ссылке и его нельзя менять.
Указатель же, может быть необязательным и в тоже время если его передать, может быть изменен внутри конструктора.


зачем человека дезинформировать?!

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

разница между ссылкой и указателем в том, что:

1.
Код:
 void myfunc(int &a)
подразумевается что будет при вызове параметр будет по значению.
т.е.
Код:
int val;
myfunc(val);

Код:
 void myfunc(int *a)
подразумевается что будет при вызове параметр будет передаваться по указателю.
т.е.
Код:
int val;
myfunc(&val);

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

2.
передавая по указателю, можно "передавать" массив.
так же работает вся математика, которая работает для указателей (+/- и т.п.)
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Ноябрь 24, 2014, 10:33 »

Объявление, к примеру, QLabel
explicit QLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0);
Если ссылки исользуються для удобства, почему в таком объявлении одновременно и тип указатели и ссылочный.
В чем профит от использования внутри функции QString-a по ссылке, а parent-a по указателю ?

Параметр text в конструкторе передается по ссылке и его нельзя менять.
Указатель же, может быть необязательным и в тоже время если его передать, может быть изменен внутри конструктора.


зачем человека дезинформировать?!

А теперь смотрим на предмет обсуждения:
const QString &text

Я говорил про ссылку в том конструкторе, а не про ссылки вообще Улыбающийся


2.
передавая по указателю, можно "передавать" массив.

Не массив передается, указатель на первый элемент массива.
« Последнее редактирование: Ноябрь 24, 2014, 10:37 от gil9red » Записан

vulko
Гость
« Ответ #9 : Ноябрь 24, 2014, 11:11 »

А теперь смотрим на предмет обсуждения:
const QString &text

Я говорил про ссылку в том конструкторе, а не про ссылки вообще Улыбающийся

Ссылка "в том конструкторе" от просто ссылки чем отличается?

Это твои слова?
Цитировать
Параметр text в конструкторе передается по ссылке и его нельзя менять.

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

text передается по константной ссылке, а не по ссылке.


2.
передавая по указателю, можно "передавать" массив.

Не массив передается, указатель на первый элемент массива.

кавычки заметил, не?))
« Последнее редактирование: Ноябрь 24, 2014, 12:26 от vulko » Записан
poru
Самовар
**
Offline Offline

Сообщений: 103


Просмотр профиля
« Ответ #10 : Ноябрь 24, 2014, 11:13 »

Разработчики рекомендуют экземпляры классов, наследованные от QObject передавать по указателю. Иначе, в ряде случаев, ваше приложение потерпит крах.
Таким образом остальные объекты, которые не наследованы от QObject, лучше всего передавать по классической схеме в виде ссылок, для обеспечения лучшей оптимизации кода компилятором.
« Последнее редактирование: Ноябрь 24, 2014, 12:21 от poru » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Ноябрь 24, 2014, 11:43 »

Объявление, к примеру, QLabel
explicit QLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0);
Если ссылки исользуються для удобства, почему в таком объявлении одновременно и тип указатели и ссылочный.
В чем профит от использования внутри функции QString-a по ссылке, а parent-a по указателю ?
По константной ссылке, это важно, напр можно так
Код
C++ (Qt)
QLabel lab("Test");
Без const так нельзя. А профит parent-a по указателю - он может быть NULL, со ссылкой так не получится (хотя физически она тоже адрес).
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #12 : Ноябрь 24, 2014, 16:10 »

explicit QLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0);

const QString &text - так быстрее т.к. без временного объекта
QWidget *parent - далее parent может быть изменен, см. код qwidget
Записан
alexeyvanzhula
Гость
« Ответ #13 : Ноябрь 24, 2014, 17:17 »

да я думал почему QString вызываеться по ссылке, а не через указатель - (про передачу по параметру даже и не спрашивал).
Теперь я понял что основная причина, изза того что ссылка не может быть нулевой и не может меняться.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #14 : Ноябрь 24, 2014, 18:33 »

да я думал почему QString вызываеться по ссылке, а не через указатель - (про передачу по параметру даже и не спрашивал).
Теперь я понял что основная причина, изза того что ссылка не может быть нулевой и не может меняться.


Подправлю (все-таки из-за меня возникло недоразумение) const QString & будет ссылкой, которую нельзя поменять Улыбающийся
Записан

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


Страница сгенерирована за 0.091 секунд. Запросов: 22.