crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Необычное использование new
dsp
  опции профиля:
сообщение 10.2.2011, 20:54
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 51
Регистрация: 12.10.2010
Пользователь №: 2109

Спасибо сказали: 4 раз(а)




Репутация:   0  


Я привык, что сначало пишем typeName* pname = new typeName;
Вроде бы понимаю, что эта строка значит:

Правая ее часть выделяет в куче место под неименованную переменную типа typeName и возвращает на нее указатель(адрес). Лева часть принимает этот адрес и хранит в pname.

При создании экземпляров виджетов пишем так же.

Вот увидел необычный для меня пример, где не создается указатель (принимающий адрес), а просто возвращается адрес.

layout->addRow(new QLabel(tr("Line 1:")), new QLineEdit);
layout->addRow(new QLabel(tr("Line 2, long text:")), new QComboBox);
layout->addRow(new QLabel(tr("Line 3:")), new QSpinBox);


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

Я не понимаю зачем так сделали, если addRow(tr("&Name", ...) вполне принимает в качестве параметра строку без создания виджета QLabel?

И еще, многие конструкторы принимают в качестве параметра
const QString & text
, т.е. ссылку на надпись ( Qlabel(const QString & text, ... ) ). В примерах я смотрю и вижу, что в одном месте передают текст через ссылку, в другом просто
const QString  text
, хотя в документации ясно указано, как надо. Почему так происходит?

Сообщение отредактировал dsp - 10.2.2011, 21:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 10.2.2011, 22:47
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(dsp @ 10.2.2011, 20:54) *
Т.е. этот способ можно применять, когда (?) нам не нужно в дальнейшем производить какие-то манипуляции с виджетами?
Да.

Чем оно необычное? Просто мне не до конца понятно.
А вообще мне кажется, что если ты в мозгу попробуешь выстроить доказательство необычности данного использования, то поймешь, что оно вовсе не необычное! И еще, этот вопрос я думаю больше относится не столько к 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  


Цитата(dsp @ 10.2.2011, 20:54) *
И еще, многие конструкторы принимают в качестве параметра

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  


Цитата(slav @ 11.2.2011, 0:44) *
Притом если передать 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  


Цитата(dsp @ 11.2.2011, 1:40) *
Не оговорились "Т.е. передача по ссылке, и по значению."?


не хочу завести в заблуждение, но я думаю, что именно так.
Тут есть кусок про QString
http://noasfera.com/?tag=qstring
Цитата(dsp @ 11.2.2011, 1:40) *
И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему?

в документации указываеться для защиты и более ефективного использования, а в официальных примерах там же если и передается строка, то она маленькой длины.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


что гадать, легко проверить , сколько байтов занимает QString в стеке, когда передаётся по значению :)

void F(int i1, const QString txt, int i2)
{
    const void* beg=0;
    const void* end=0;
    if(&i2>&i1)
    {
        beg=(&i1+1); //начало txt
        end=&i2; //конец txt+1
    }
    else
    {
        beg=&i2; //начало txt
        end=(&i1+1); //конец txt+1
    }
    
    
    int diff=int(end)-int(beg);// == 4
}

F(0,"123456789123456789123456789123456789",0);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.2.2011, 12:56
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(dsp @ 10.2.2011, 22:54) *
Правая ее часть выделяет в куче место под неименованную переменную типа typeName и возвращает на нее указатель(адрес). Лева часть принимает этот адрес и хранит в pname.
тут ты важный момент упустил - не просто место выделяет в куче, а создаёт объек, и указатель возвращает на созданный объект.

Цитата(dsp @ 11.2.2011, 3:40) *
И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему?
В Qt есть один нюанс: тип QString - тип с неявным разделением данных. И когда происходит передача по значению, реального копирования содержимого не происходит. Копирование происходит только при изменении оригинала или "копии". Это позволяет экономить время на копирование.
Сделано так потому, что этот тип очень часто используется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 14.2.2011, 12:08
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Цитата(Litkevich Yuriy @ 12.2.2011, 13:56) *
В Qt есть один нюанс: тип QString - тип с неявным разделением данных. И когда происходит передача по значению, реального копирования содержимого не происходит. Копирование происходит только при изменении оригинала или "копии". Это позволяет экономить время на копирование.
Сделано так потому, что этот тип очень часто используется.

Насколько я знаю, это сделано для всех классов, которые не наследуются от QObject. Подробнее гуглить по словам implicit sharing.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 16:46