Russian Qt Forum

Qt => Общие вопросы => Тема начата: alexeyvanzhula от Ноябрь 24, 2014, 00:14



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


Название: Re: ссылки\указатели
Отправлено: Johnik от Ноябрь 24, 2014, 00:21
здесь частично объясняется (касательно Qt):
http://qt-project.org/wiki/API-Design-Principles


Название: Re: ссылки\указатели
Отправлено: alexeyvanzhula от Ноябрь 24, 2014, 04:22
Спасибо. Все что я тут вижу по ссылкам, так это то что разрабы рекомендуют пользоваться указателями а не ссылками, потому что они удобнее для чтения.
Почему же QString принимают по ссылке (в описании нативных классов) ?


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

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


Название: Re: ссылки\указатели
Отправлено: alexeyvanzhula от Ноябрь 24, 2014, 05:58
хорошо. читаю вот примеры (официальные):
1. void addPiece(QPixmap pixmap, QPoint location);
2. const QRect targetSquare(const QPoint &position) const;

Почему объявления 1 и 2 просят разные типы QPoint?
И почему QRect константная функция? Что это дает?


Название: Re: ссылки\указатели
Отправлено: gil9red от Ноябрь 24, 2014, 06:55
1.
Потому что так написали разработчики и им надо бы задавать этот вопрос :)

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

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


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


Название: Re: ссылки\указатели
Отправлено: vulko от Ноябрь 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.
передавая по указателю, можно "передавать" массив.
так же работает вся математика, которая работает для указателей (+/- и т.п.)


Название: Re: ссылки\указатели
Отправлено: gil9red от Ноябрь 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.
передавая по указателю, можно "передавать" массив.

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


Название: Re: ссылки\указатели
Отправлено: vulko от Ноябрь 24, 2014, 11:11
А теперь смотрим на предмет обсуждения:
const QString &text

Я говорил про ссылку в том конструкторе, а не про ссылки вообще :)

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

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

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

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


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

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

кавычки заметил, не?))


Название: Re: ссылки\указатели
Отправлено: poru от Ноябрь 24, 2014, 11:13
Разработчики рекомендуют экземпляры классов, наследованные от QObject передавать по указателю. Иначе, в ряде случаев, ваше приложение потерпит крах.
Таким образом остальные объекты, которые не наследованы от QObject, лучше всего передавать по классической схеме в виде ссылок, для обеспечения лучшей оптимизации кода компилятором.


Название: Re: ссылки\указатели
Отправлено: Igors от Ноябрь 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, со ссылкой так не получится (хотя физически она тоже адрес).


Название: Re: ссылки\указатели
Отправлено: qate от Ноябрь 24, 2014, 16:10
explicit QLabel(const QString &text, QWidget *parent=0, Qt::WindowFlags f=0);

const QString &text - так быстрее т.к. без временного объекта
QWidget *parent - далее parent может быть изменен, см. код qwidget


Название: Re: ссылки\указатели
Отправлено: alexeyvanzhula от Ноябрь 24, 2014, 17:17
да я думал почему QString вызываеться по ссылке, а не через указатель - (про передачу по параметру даже и не спрашивал).
Теперь я понял что основная причина, изза того что ссылка не может быть нулевой и не может меняться.


Название: Re: ссылки\указатели
Отправлено: gil9red от Ноябрь 24, 2014, 18:33
да я думал почему QString вызываеться по ссылке, а не через указатель - (про передачу по параметру даже и не спрашивал).
Теперь я понял что основная причина, изза того что ссылка не может быть нулевой и не может меняться.


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


Название: Re: ссылки\указатели
Отправлено: alexeyvanzhula от Ноябрь 24, 2014, 19:20
вернее нельзя, при const QString &,поменять объект, с которым она связана? Так?


Название: Re: ссылки\указатели
Отправлено: alexeyvanzhula от Ноябрь 24, 2014, 19:45
Есть ли смысл иногда брать параметр QString по значению, а не по ссылке\указателю, в своих методах?
Смотрю вроде и так люди делают. Это путает


Название: Re: ссылки\указатели
Отправлено: Alex Custov от Ноябрь 24, 2014, 20:23
Есть ли смысл иногда брать параметр QString по значению, а не по ссылке\указателю, в своих методах?
Смотрю вроде и так люди делают. Это путает

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

http://qt-project.org/doc/qt-5/implicit-sharing.html


Название: Re: ссылки\указатели
Отправлено: Alex Custov от Ноябрь 24, 2014, 20:24
вернее нельзя, при const QString &,поменять объект, с которым она связана? Так?

да. Можно вызывать только константные методы.


Название: Re: ссылки\указатели
Отправлено: alexeyvanzhula от Ноябрь 24, 2014, 20:50
Всем спасибо за ответы. Познавательно )


Название: Re: ссылки\указатели
Отправлено: CriDos от Декабрь 01, 2014, 20:00
Советую сначала потратить время на изучение основ C++ и потом уже изучать Qt.
По теме информацию можно почитать тут: http://ru.wikibooks.org/wiki/%D0%A1%D0%B8%2B%2B
Раздел: Передача параметров по ссылке в Си++