Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Необычное использование new

Автор: dsp 10.2.2011, 20:54

Я привык, что сначало пишем 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
, хотя в документации ясно указано, как надо. Почему так происходит?

Автор: ViGOur 10.2.2011, 22:47

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

Чем оно необычное? Просто мне не до конца понятно.
А вообще мне кажется, что если ты в мозгу попробуешь выстроить доказательство необычности данного использования, то поймешь, что оно вовсе не необычное! И еще, этот вопрос я думаю больше относится не столько к Qt, сколько к С++. :)

Автор: dsp 10.2.2011, 22:56

Просто я никогда не видел подобного использования new. Вот и захотелось спросить. И да, данный вариант мне нравиться.

Просто у меня в головек куча мелочей, "которые не дают мне жить =)". И если я про них не спрошу сейчас, то в дальнейшем ком их только возрастет и будет лишь иллюзия понимания, а мне важна уверенность!

Автор: slav 11.2.2011, 0:44

Цитата(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

Цитата(slav @ 11.2.2011, 0:44) *
Притом если передать const QString text - то будет создана его копия и помещена в стек. Т.е. передача по ссылке, и по значению.


Не оговорились "Т.е. передача по ссылке, и по значению."?

QLabel(const QString text, ...) - из этого я вижу передачу только по значению в виде копии!

И везде в официальных примерах передача идет по значению, а в документации по ссылке! почему?

Автор: slav 11.2.2011, 2:07

Цитата(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

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

Автор: Алексей1153 11.2.2011, 8:09

что гадать, легко проверить , сколько байтов занимает 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

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

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

Автор: Rocky 14.2.2011, 12:08

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

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

Автор: Litkevich Yuriy 14.2.2011, 12:33

Цитата(Rocky @ 14.2.2011, 14:08) *
это сделано для всех классов
http://doc.crossplatform.ru/qt/4.5.0/shared.html, но не для всех (QPoint, ...).

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)