Необычное использование new |
Здравствуйте, гость ( Вход | Регистрация )
Необычное использование new |
dsp |
10.2.2011, 20:54
Сообщение
#1
|
Студент Группа: Участник Сообщений: 51 Регистрация: 12.10.2010 Пользователь №: 2109 Спасибо сказали: 4 раз(а) Репутация: 0 |
Я привык, что сначало пишем typeName* pname = new typeName;
Вроде бы понимаю, что эта строка значит: Правая ее часть выделяет в куче место под неименованную переменную типа typeName и возвращает на нее указатель(адрес). Лева часть принимает этот адрес и хранит в pname. При создании экземпляров виджетов пишем так же. Вот увидел необычный для меня пример, где не создается указатель (принимающий адрес), а просто возвращается адрес.
Т.е. этот способ можно применять, когда (?) нам не нужно в дальнейшем производить какие-то манипуляции с виджетами? Я не понимаю зачем так сделали, если addRow(tr("&Name", ...) вполне принимает в качестве параметра строку без создания виджета QLabel? И еще, многие конструкторы принимают в качестве параметра , т.е. ссылку на надпись ( Qlabel(const QString & text, ... ) ). В примерах я смотрю и вижу, что в одном месте передают текст через ссылку, в другом просто , хотя в документации ясно указано, как надо. Почему так происходит?
Сообщение отредактировал dsp - 10.2.2011, 21:28 |
|
|
ViGOur |
10.2.2011, 22:47
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Т.е. этот способ можно применять, когда (?) нам не нужно в дальнейшем производить какие-то манипуляции с виджетами? Да.Чем оно необычное? Просто мне не до конца понятно. А вообще мне кажется, что если ты в мозгу попробуешь выстроить доказательство необычности данного использования, то поймешь, что оно вовсе не необычное! И еще, этот вопрос я думаю больше относится не столько к Qt, сколько к С++. |
|
|
dsp |
10.2.2011, 22:56
Сообщение
#3
|
Студент Группа: Участник Сообщений: 51 Регистрация: 12.10.2010 Пользователь №: 2109 Спасибо сказали: 4 раз(а) Репутация: 0 |
Просто я никогда не видел подобного использования new. Вот и захотелось спросить. И да, данный вариант мне нравиться.
Просто у меня в головек куча мелочей, "которые не дают мне жить =)". И если я про них не спрошу сейчас, то в дальнейшем ком их только возрастет и будет лишь иллюзия понимания, а мне важна уверенность! Сообщение отредактировал dsp - 10.2.2011, 22:58 |
|
|
slav |
11.2.2011, 0:44
Сообщение
#4
|
Студент Группа: Участник Сообщений: 19 Регистрация: 22.12.2010 Пользователь №: 2292 Спасибо сказали: 0 раз(а) Репутация: 0 |
И еще, многие конструкторы принимают в качестве параметра const QString & text , т.е. ссылку на надпись ( Qlabel(const QString & text, ... ) ). В примерах я смотрю и вижу, что в одном месте передают текст через ссылку, в другом просто const QString text , хотя в документации ясно указано, как надо. Почему так происходит? В документации указано что надо передавать указатель, потому что он будет занимать меньше места в стеке чем вся строка. Притом если передать const QString text - то будет создана его копия и помещена в стек. Т.е. передача по ссылке, и по значению. |
|
|
dsp |
11.2.2011, 1:40
Сообщение
#5
|
Студент Группа: Участник Сообщений: 51 Регистрация: 12.10.2010 Пользователь №: 2109 Спасибо сказали: 4 раз(а) Репутация: 0 |
Притом если передать const QString text - то будет создана его копия и помещена в стек. Т.е. передача по ссылке, и по значению. Не оговорились "Т.е. передача по ссылке, и по значению."? QLabel(const QString text, ...) - из этого я вижу передачу только по значению в виде копии! И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему? Сообщение отредактировал dsp - 11.2.2011, 1:43 |
|
|
slav |
11.2.2011, 2:07
Сообщение
#6
|
Студент Группа: Участник Сообщений: 19 Регистрация: 22.12.2010 Пользователь №: 2292 Спасибо сказали: 0 раз(а) Репутация: 0 |
Не оговорились "Т.е. передача по ссылке, и по значению."? не хочу завести в заблуждение, но я думаю, что именно так. Тут есть кусок про QString http://noasfera.com/?tag=qstring И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему? в документации указываеться для защиты и более ефективного использования, а в официальных примерах там же если и передается строка, то она маленькой длины. |
|
|
Iron Bug |
11.2.2011, 7:57
Сообщение
#7
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
как всё запущено...
в приведённом куске кода (неважно, QT это или нет) выделяются динамические объекты, которые останутся в памяти после выхода из процедуры, которая их создала. и смысл передачи указателей в данном случае в том, чтобы объект layout остался инициализированным и после выхода из данного куска кода, до явного уничтожения созданных объектов. с локальными строками пример не проканает, ибо строки будут локальными и тупо исчезнут после выхода из процедуры, а указатели на них повиснут в неизвестности. |
|
|
Алексей1153 |
11.2.2011, 8:09
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
что гадать, легко проверить , сколько байтов занимает QString в стеке, когда передаётся по значению
|
|
|
Litkevich Yuriy |
12.2.2011, 12:56
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Правая ее часть выделяет в куче место под неименованную переменную типа typeName и возвращает на нее указатель(адрес). Лева часть принимает этот адрес и хранит в pname. тут ты важный момент упустил - не просто место выделяет в куче, а создаёт объек, и указатель возвращает на созданный объект.И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему? В Qt есть один нюанс: тип QString - тип с неявным разделением данных. И когда происходит передача по значению, реального копирования содержимого не происходит. Копирование происходит только при изменении оригинала или "копии". Это позволяет экономить время на копирование.Сделано так потому, что этот тип очень часто используется. |
|
|
Rocky |
14.2.2011, 12:08
Сообщение
#10
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
В Qt есть один нюанс: тип QString - тип с неявным разделением данных. И когда происходит передача по значению, реального копирования содержимого не происходит. Копирование происходит только при изменении оригинала или "копии". Это позволяет экономить время на копирование. Сделано так потому, что этот тип очень часто используется. Насколько я знаю, это сделано для всех классов, которые не наследуются от QObject. Подробнее гуглить по словам implicit sharing. |
|
|
Текстовая версия | Сейчас: 2.12.2024, 23:56 |