А где создание объекта

Judo
Дата: 28.09.2014 01:46:14
Делаю первые шаги в Куте. Нашел пример как показать messagebox
  QMessageBox msgBox;
  msgBox.setText("Hello Here");
  msgBox.exec();


Я ожидал увидеть что то типа:
  QMessageBox mb = new QMessageBox();


Возник вопрос как это тогда работает без создания объекта, т.е. мы имеем просто ссылку msgBox а объекта нет ?
Dimitry Sibiryakov
Дата: 28.09.2014 02:08:05

Тут тебе не паскаль. msgBox - в натуре объект, а не какая-то там ссылка.

Posted via ActualForum NNTP Server 1.5

Judo
Дата: 28.09.2014 02:21:53
Dimitry Sibiryakov
Тут тебе не паскаль. msgBox - в натуре объект, а не какая-то там ссылка.

Дима - запарил ))) Вопрос адресован был к кутешникам
Judo
Дата: 28.09.2014 03:32:59
Почитал в доке куте, что QMessageBox msgBox; фактически создает статический объект в стеке.
куте
As you have recognized already there are different ways to use QMessageBox. The static method is for displaying a message box quickly. IMHO it is more a matter of taste and preference which you are using.
However, the non-static methods you are referring are different from the location where you are placing the instance. The first method uses the stack for the complete object. The second method is using the heap

Так в принципе понятно, идем дальше, самое интересное в словах
куте
The first method uses the stack for the complete object.

Открываю исходники QMessageBox.h и ищу слово static. В итоге ничего напоминающего на создание статического объекта в стеке - нет. Т.е. я ожидал что статический стековый объект - будет глобальным
stackoverflow
A static variable is basically a global variable, even if you cannot access it globally. Usually there is an address for it that is in the executable itself. There is only one copy for the entire program. No matter how many times you go into a function call (or class) (and in how many threads!) the variable is referring to the same memory location.

И поэтому использование
QMessageBox msgBox;

плохой тон ввиду потоков и проч, ввиду того что объект один глобально.
Поправьте меня если я не прав. После этого не охота практиковать использование QMessageBox без new.

Также получается что фраза из приведенного выше текста
автор
..
uses the stack for the complete object
..

не верна. Потому что объект static variable is basically a global variable - т.е. объект все таки в хипе, а ссылка на него в стеке - так ?
Anatoly Moskovsky
Дата: 28.09.2014 05:41:25
Judo,

Слово "статический" в тех цитатах, что вы привели, относится к методам, а не объекту.
А чтобы создать статический объект нужно явно указать static при его объявлении.
Более того, нельзя вообще создать "статический объект в стеке". Можно либо в стеке либо статический.
Таким образом ваши выводы про глобальность объекта, проблемы с потоками и пр. не соответствуют действительности.
Sheraton
Дата: 28.09.2014 15:47:49
Объекты создаются либо статически (при компиляции вы заранее знаете, что этот объект точно будет нужен) либо динамически (в процессе работы программы, но может и не понадобиться), статические объекты размещаются в стеке, динамические в куче.

QMessageBox msgBox; - это статическое создание объекта в стеке.

QMessageBox mb = new QMessageBox(); - это динамическое создание объекта в куче.
Anatoly Moskovsky
Дата: 28.09.2014 16:21:05
Sheraton,

Откуда вы эту терминологию берете :)

По месту выделения памяти для данных объекты делятся на
- автоматические (в стеке)
- статические (в глобальном сегменте данных)
- динамические (в куче)

Ни в каком другом смысле слово "статический" по отношению к объектам в С/С++ не применяется.
И поэтому ни при каких обстоятельствах статические объекты не могут размещаться в стеке.
Sheraton
Дата: 28.09.2014 16:38:08
Anatoly Moskovsky
Sheraton,

Откуда вы эту терминологию берете :)

По месту выделения памяти для данных объекты делятся на
- автоматические (в стеке)
- статические (в глобальном сегменте данных)
- динамические (в куче)

Ни в каком другом смысле слово "статический" по отношению к объектам в С/С++ не применяется.
И поэтому ни при каких обстоятельствах статические объекты не могут размещаться в стеке.


Это уже детали. Для новичка изучающего С++ лучше простое объяснение.
Sheraton
Дата: 28.09.2014 16:48:38
И кстати это не моя терминология. Это из книги Липпмана "Язык программирования С++. Вводный курс" Издательство "Невский Диалект", 2003 год. стр.50.

"В С++ объекты могут быть размещены либо статически - во время компиляции, либо динамически - во время выполнения программы, путем вызова функций из стандартной библиотеки. Основная разница в использовании этих методов - в их эффективности. Статическое размещение более эффективно, так как выделение памяти происходит до выполнения программы, однако оно гораздо менее гибко, потому что мы должны заранее знать тип и размер размещаемого объекта."
Anatoly Moskovsky
Дата: 28.09.2014 16:48:51
Sheraton
Это уже детали. Для новичка изучающего С++ лучше простое объяснение.

Это не детали.
Там выше чел уже запутался и искал глобальные объекты там, где их нет, именно из-за неуместного употребления термина "статический" по отношению к методу создания объектов.