Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создан ли объект во время выполнения тела констр-а, где об этом в стандарте написано? 
V
    Опции темы
zim22
Дата 9.4.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



mes, спасибо!
Цитата(Lazin @  9.4.2009,  10:29 Найти цитируемый пост)
а как ты собираешься обращаться к не полностью созданному объекту, иначе чем в теле конструктора? 

так как mes написал. В списке инициализации.

Вот чуть поинтересней код: 
Если в функции print() обращаться к string, а не к int, то программа упадёт. 
Код

#include <iostream>
#include <string>

class Foo;
typedef void (Foo::*fcn)();

int func(Foo& foo, fcn par1) {
  (foo.*par1)();
  return 10;
}
class Foo {
public:
  Foo() : x(func(*this, &Foo::print)) { 
    std::cout << "S: " << s << std::endl; 
  }
  void print() { std::cout << s; }

private:
  int x;
  std::string s;
};

int main()
{
  Foo f1;
  return 0;
}





--------------------
PM MAIL   Вверх
Fazil6
Дата 9.4.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(Anikmar @  9.4.2009,  10:41 Найти цитируемый пост)
Что есть инициализация? Для простых переменных - присваивание начального значения, можно вне тела конструктора.
Для буферов - можно в конструкторе, у меня всегда отдельным методом Init

читаем ветку сначала. Инициализация - это вызов конструктора. Речь не о инициализации конкретных членов класса , а о инициализации объекта класса, как чего-то цельного и неделимого. Это включает уже в себя инициализацию отдельных членов. Иначе как в конструкторе как это делать? 
Цитата(Anikmar @  9.4.2009,  10:41 Найти цитируемый пост)
Стандартизировать это сложно.

что тут сложного?

Цитата

пункт такойто.
Создание объекта.

Создание объекта - это выделение памяти и инициализация

вот я и простандартизировал.


Цитата(Anikmar @  9.4.2009,  10:41 Найти цитируемый пост)
Лично для меня объект создан тогда - когда им можно пользоваться, привязывать это к конструктору - узковато вроде как получается. 

согласен. Вот для меня совершенно логично, что пользоваться объектом можно после вызова конструктора. 
Ведь пока автомобиль не сошел с конвейера им пользуются исключительно так же как и конструктор "пользуется" объектом во время его "создания". Когда сошел с конвейера (читай вышлри из конструктора) можно пользоваться! Ура!!!

... смотря конечно какой автомобиль... 

PM MAIL   Вверх
mes
Дата 9.4.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Fazil6 @  9.4.2009,  10:23 Найти цитируемый пост)

... смотря конечно какой автомобиль... 

имхо,  в противном случае (если автомобилем нельзя пользоваться после того, как он сошел с контейнера) вина конструктора, а не автомобиля smile

Добавлено @ 11:33
Цитата(zim22 @  9.4.2009,  10:21 Найти цитируемый пост)
Если в функции print() обращаться к string, а не к int, то программа упадёт. 

естественно, s еще не создана smile
чтоб решить эту проблему , нужно поменять х и s местами.. (хотя подобные трюки лучше не использовать)  smile 


Это сообщение отредактировал(а) mes - 9.4.2009, 11:35


--------------------
PM MAIL WWW   Вверх
Fazil6
Дата 9.4.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(zim22 @  9.4.2009,  10:17 Найти цитируемый пост)
Спорный какой-то вопрос. А если объект не имеет буфера и не выделяет дополнительно никакую память? То он является созданным? или нет? 

с технической точки зрения - он создан. Ведь указатель (который и является членом класса) уже создан. И он куда-то даже указывает (то на что он указывает ведь членом класса не является). И им можно пользоваться (например присвоить ему значение). Но то на что он должен по логике вещей указывать еще нет. 
Вот и считается, что объект создан, когда вызвался конструктор. Ты ведь как пользователь не обязан знать как настраивается объект. Значит если вызвался конструктор, то все необходимые приготовления к использованию сделаны (сделаны они на самом деле или нет, надо их было делать или нет - пользователь за это не отвечает. И не должен отвечать) и ты как пользователь сделал все что обязан был (сказал что-то типа "эй ты, созайся вот таким способом"). 
PM MAIL   Вверх
zim22
Дата 9.4.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Fazil6 @  9.4.2009,  11:34 Найти цитируемый пост)
"эй ты, созайся вот таким способом"

smile понял, спасибо


--------------------
PM MAIL   Вверх
Anikmar
Дата 9.4.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(Fazil6 @  9.4.2009,  11:23 Найти цитируемый пост)
согласен. Вот для меня совершенно логично, что пользоваться объектом можно после вызова конструктора. 
Ведь пока автомобиль не сошел с конвейера им пользуются исключительно так же как и конструктор "пользуется" объектом во время его "создания". Когда сошел с конвейера (читай вышлри из конструктора) можно пользоваться! Ура!!!

... смотря конечно какой автомобиль... 


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

С другой стороны наличие конструктора не гарантирует работоспособность объекта - т.к. все зависит от конкретики. Почему я и сказал, что стандартизировать здесь сложно - все зависит от конкретной ситуации.

А касаемо собственно обсуждения - говорить, что в теле конструктора объект не создан (собственно с чего начиналась тема) как-то неправильно - все зависит от объекта.
PM MAIL ICQ   Вверх
zim22
Дата 9.4.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Anikmar @  9.4.2009,  13:21 Найти цитируемый пост)
С одной стороны можно пользоваться объектами вообще без конструктора

компилятор всё-равно создаст синтезируемый конструктор, если вы его явно не создаёте.


--------------------
PM MAIL   Вверх
Anikmar
Дата 9.4.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(zim22 @  9.4.2009,  16:13 Найти цитируемый пост)
компилятор всё-равно создаст синтезируемый конструктор, если вы его явно не создаёте. 

Бесспорно.

Я согласен полностью с этим:
Цитата(Fazil6 @  9.4.2009,  09:41 Найти цитируемый пост)
тут по большему счету вопрос терминологии. Называть объект созданным во время вызова конструктора или НЕсозданным, я например, особого значения не придаю. Главное понимать что происходит.  


А по поводу плюсов и минусов - человеку, получившему возможность показать свою значимость хочется потешить собственное самолюбие. Это я про UnrealMan. Ставить - Lazin-у - это просто смешно.

Ставить минус мне, не участвуя в теме - это просто некорректно. Ну мне это, если честно, по барабану  smile.
PM MAIL ICQ   Вверх
zim22
Дата 9.4.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Anikmar, что интересней всего, UnrealMan даже не пытается понять точку зрения собеседника. Тупо ставит минусы smile
Цитата

компилятор всё-равно создаст синтезируемый конструктор, если вы его явно не создаёте. 

кстати, а вы знали, что компилятор также создаст синтезируемый деструктор, даже в том случае, если вы его всё-равно явно создадите. Т.е. в классе существует как минимум 1, а если вы определили свой - то два деструктора smile


--------------------
PM MAIL   Вверх
Anikmar
Дата 9.4.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(zim22 @  9.4.2009,  16:34 Найти цитируемый пост)
кстати, а вы знали, что компилятор также создаст синтезируемый деструктор, даже в том случае, если вы его всё-равно явно создадите. Т.е. в классе существует как минимум 1, а если вы определили свой - то два деструктора  

Нет, если честно. А что тогда делает синтетик? Просто вызывает что-то вроде free?
PM MAIL ICQ   Вверх
zim22
Дата 9.4.2009, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Anikmar @  9.4.2009,  16:54 Найти цитируемый пост)
 А что тогда делает синтетик? Просто вызывает что-то вроде free?

Из книжки:

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

Код

class Sales_item {
public:
  Sales_item(std::string s) : isbn(s) { }
  ~Sales_item() { }
private:
  std::string isbn;
  double revenue;
  int units_sold;
};


При удалении объектов класса Sales_item этот деструктор (определённый нами) ничего не делает. После того, как он завершает работу, выполняется
синтезируемый деструктор, который и удаляет все переменный-члены класса. Синтезируемый деструктор удаляет переменную-член типа string,
вызывая деструктор класса string, который освобождает область памяти, используемой для хранения переменной isbn. Переменные-члены units_sold и
revenue имеют встроенный тип, поэтому для их удаления синтезируемый деструктор ничего не делает.

Это сообщение отредактировал(а) zim22 - 9.4.2009, 17:19


--------------------
PM MAIL   Вверх
vinter
Дата 9.4.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 8
Всего: 56



Цитата(Anikmar @  9.4.2009,  17:22 Найти цитируемый пост)
А по поводу плюсов и минусов - человеку, получившему возможность показать свою значимость хочется потешить собственное самолюбие. Это я про UnrealMan. Ставить - Lazin-у - это просто смешно.

Lazin, не прав в своей фразе, оговорка достаточно серьезная, точнее во второй ее части. А ставить за это минус, или нет это дело каждого. Для этого репутация и существует.


--------------------
Мой блог
PM MAIL WWW   Вверх
and277
Дата 9.4.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Интересно а если я в main в первую очередь допустим объявлю указатель на объект. Конструктор  при создании этого указателя запустится? Если да- то что он проинициализирует?

Или просто указателю инициализируется каким то адресом и все... До присвоения объекта этому указателю....
Извеняюсь заранее за сумбурность.

Это сообщение отредактировал(а) and277 - 9.4.2009, 18:31
PM MAIL   Вверх
Anikmar
Дата 9.4.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(and277 @  9.4.2009,  18:25 Найти цитируемый пост)
Интересно а если я в main в первую очередь допустим объявлю указатель на объект. Конструктор  при создании этого указателя запустится? Если да- то что он проинициализирует?

Или просто указателю инициализируется каким то адресом и все... До присвоения объекта этому указателю....
Извеняюсь заранее за сумбурность.


Если просто объявите - никаких конструкторв не вызовется, пока не создадите объект оператором new

 smile 
Цитата(vinter @  9.4.2009,  18:00 Найти цитируемый пост)
Lazin, не прав в своей фразе, оговорка достаточно серьезная, точнее во второй ее части. А ставить за это минус, или нет это дело каждого. Для этого репутация и существует. 


Нормально, если человек оспорит фразу, чтобы все видели спор и получали дополнительные знания. Вы не меньше меня на форуме и знаете, что репутация в минус ставится за досаточно серьезные нарушения - грубость, введение в заблуждение и т.п. При этом нормальные люди не тихарят, а пишут об этом в посте.

Конечно очки, баллы - это все похоже на детскую игру, но если уж в нее играем - почему не придерживаться неписанных правил? Lazin и без всякой репутации имеет авторитет - достаточно проследить несколько тем с его участием. А вот тихарщик, который только и делает, что ставит минусы лично для меня авторитета не представляет, пусть он в тысячу раз лучше меня программирует. ИМХО, естественно.

Хотя некоторую долю развлекухи он своими минусами сегодня внес  smile .



PM MAIL ICQ   Вверх
Rififi
Дата 9.4.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 3
Всего: 36



минусы, плюсы... детский сад, штаны на лямках smile:
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.