Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание объектов / 15 сообщений из 15, страница 1 из 1
16.11.2013, 16:44
    #38467332
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
Есть несколько простых вопросов которые хотелось бы уточнить (я новичёк в С++, делфист) :) Уточню, пишу под Arduino, может там немного иные принципы.

Допустим у нас есть два определения:
Код: plaintext
1.
2.
ClassOne one;
ClassOne *two;


По идее в первом случае one это указатель на объект?
Во втором тогда two указатель на указатель на объект?
Судя из примеров кода получается что в первом случае объект создаётся в момент инициализации? Если так, то уничтожится ли объект если я сделаю
Код: plaintext
1.
one = NULL;

?

Снова, если он создаётся в первом случае автоматом тогда...
Код: plaintext
1.
2.
3.
class MyClass {
  WebServer server(80);
};


Компилятор матерится на такой вариант.

Помогите, плиз :)
...
Рейтинг: 0 / 0
16.11.2013, 16:51
    #38467337
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
xneoПо идее в первом случае one это указатель на объект?
Это у тебя дурная дельфийская идея. Нет, это не указатель, это сам объект, размещённый в
стэке. И уничтожается он тогда же когда и все остальные локальные переменные - при выходе
из блока где объявлен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16.11.2013, 16:58
    #38467339
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
Dimitry SibiryakovxneoПо идее в первом случае one это указатель на объект?
Это у тебя дурная дельфийская идея. Нет, это не указатель, это сам объект, размещённый в
стэке. И уничтожается он тогда же когда и все остальные локальные переменные - при выходе
из блока где объявлен.


Тоесть, он создаётся в момент инициализации и размещается в стеке, так?
Что произойдёт если я сделаю one = *two; ? Весь объект, на который указывает two , продублируется и перезапишет в стеке one ? Если они занимают по 300 байт, получается мы скопируем эти 300 байт, так?
...
Рейтинг: 0 / 0
16.11.2013, 17:02
    #38467343
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
Код: plaintext
1.
2.
3.
ClassOne one;

one = NULL;


Что произойдёт в последней строчке? Это ж не указатель.
...
Рейтинг: 0 / 0
16.11.2013, 17:05
    #38467347
Создание объектов
xneo
Код: plaintext
1.
2.
3.
ClassOne one;

one = NULL;


Что произойдёт в последней строчке? Это ж не указатель.
Зависит от конструктора класса ClassOne, если он не принимает NULL, то просто не скомпилируется.
...
Рейтинг: 0 / 0
16.11.2013, 18:15
    #38467377
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
просто не скомпилируетсяxneo
Код: plaintext
1.
2.
3.
ClassOne one;

one = NULL;


Что произойдёт в последней строчке? Это ж не указатель.
Зависит от конструктора класса ClassOne, если он не принимает NULL, то просто не скомпилируется.

Не совсем понял причём тут конструктор?
...
Рейтинг: 0 / 0
17.11.2013, 01:15
    #38467562
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
Допустим у нас есть два определения:
Код: plaintext
1.
2.
ClassOne one;
ClassOne *two;



По идее в первом случае one это указатель на объект?

Нет, это переменная типа "объект ClassOne"


Во втором тогда two указатель на указатель на объект?

Во втором — да.


Судя из примеров кода получается что в первом случае объект создаётся в момент инициализации?


Если так, то уничтожится ли объект если я сделаю


Код: plaintext
1.
one = NULL;

?


Это недопустимая конструкция. Будет ошибка компиляции.

Если
two = NULL;

объект все равно не удалится.
Надо явно вызывать delete.


Снова, если он создаётся в первом случае автоматом тогда...
Код: plaintext
1.
2.
3.
class MyClass {
  WebServer server(80);
};


Компилятор матерится на такой [/quot]

Правильно матерится.
Что тв хотел сделать?
...
Рейтинг: 0 / 0
17.11.2013, 01:17
    #38467563
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
Dimitry SibiryakovxneoПо идее в первом случае one это указатель на объект?
Это у тебя дурная дельфийская идея. Нет, это не указатель, это сам объект, размещённый в
стэке. И уничтожается он тогда же когда и все остальные локальные переменные - при выходе
из блока где объявлен.


Не факт, что объект на стеке
...
Рейтинг: 0 / 0
17.11.2013, 01:20
    #38467565
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
xneoпросто не скомпилируетсяпропущено...

Зависит от конструктора класса ClassOne, если он не принимает NULL, то просто не скомпилируется.

Не совсем понял причём тут конструктор?
Конструктор и правда ни при чем.

Компилятор будет искать оператор присваивания из void *.
...
Рейтинг: 0 / 0
17.11.2013, 13:59
    #38467725
дадуда___
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
Открывай учебник по C++ и учи. Отрывочные познания в виде ответов с форуме здесь не прокляпают. Размещение объектов на стеке очень удобно для локальных объектов (чтобы не вызывать delete). В этих ваших делфях, которые якобы создавались для разработки прикладных программ даже этого нет. То есть уровень обычного низкоуровневого С.
...
Рейтинг: 0 / 0
17.11.2013, 16:16
    #38467793
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
MasterZivПравильно матерится.
Что ты хотел сделать?
Я могу описать локальную переменную таким способом:
Код: plaintext
1.
2.
3.
MyClass::SomeMethod() {
  WebServer server(80);
}


Если я правильно понял, то при входе в метод(процедуру) эта переменная инициализируется вызывая конструктор и при выходе из процедуры уничтожается, вызывая деструктор (или нет?).
Если так, то почему компилятор не даёт указать такую же переменную для класса?
Код: plaintext
1.
2.
3.
class MyClass {
  WebServer server(80);
};
...
Рейтинг: 0 / 0
17.11.2013, 16:20
    #38467796
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
xneoпочему компилятор не даёт указать такую же переменную для класса?
Потому что в классе это уже не переменная, а member, инициализация которого должна
проводиться в конструкторе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.11.2013, 16:23
    #38467798
xneo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
Теперь всё понятно, большое спасибо за ответы :)
...
Рейтинг: 0 / 0
17.11.2013, 18:57
    #38467875
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
xneoMasterZivПравильно матерится.
Что ты хотел сделать?
Я могу описать локальную переменную таким способом:
Код: plaintext
1.
2.
3.
NuClide::SomeMethod() {
  WebServer server(80);
}


Если я правильно понял, то при входе в метод(процедуру) эта переменная инициализируется вызывая конструктор и при выходе из процедуры уничтожается, вызывая деструктор (или нет?).


Да, так.



Если так, то почему компилятор не даёт указать такую же переменную для класса?
Код: plaintext
1.
2.
3.
class MyClass {
  WebServer server(80);
};



Здесь два действия, объявление члена класса и инициализация.
Объявление разрешено, а инициализация — нет, потому что конструкторы членов должны вызываться из конструкторов классов. Конструкторов много, потому и так заведено.
...
Рейтинг: 0 / 0
18.11.2013, 05:42
    #38468088
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание объектов
xneo,

Реомендую глянуть книгу
Джефф Элджер
"C++" Библиотека Программиста
(чёрненькая, мягэнькая, формат А5 наверное - половинка А4)

Она как бы с элементарных действий, но очень занимательна.
Даёт понимание проблем, наталкивает на интересные решения, не так суха и не сильно замудренна.
Если дочитаете до конца и проникнетесь - многие вопросы на этом форуме будут понятны, как и красивые способы их решений :)

удачи вам
(круглый)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Создание объектов / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]