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

Поиск:

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(Rififi @  9.4.2009,  22:07 Найти цитируемый пост)
минусы, плюсы... детский сад, штаны на лямках

да не говори smile 

Цитата(Anikmar @  9.4.2009,  16:22 Найти цитируемый пост)
Это я про UnrealMan.

UnrealMan(как впрочем и Fazil6), не раз оказывал мне услугу, подлавливая на глупостях, которые я писал в разделе по срр, жаль что он сюда редко заходит smile 
PM MAIL Skype GTalk   Вверх
Rififi
Дата 9.4.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



и кстати уж лучше получить минус от Унреала (хоть что-то полезное узнаешь), чем все эти плюсы от нубиков, которые еще сами не веря своему счастью - продержались еще семестр, с полными штанами радости остервенело давят кнопку [+]((((:
PM MAIL   Вверх
J0ker
Дата 9.4.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



все, что выше не читал  smile 
в конструкторе объект еще не создан - и док-во этому факту то, что при эксцепшене в конструкторе автоматически вызывается соответствующий delete без вызова деструктора


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


uploading...
****


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

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



Rififi

Да какая разница, плюс, минус smile что это меняет? Меня немного другое смущает..минус это в какой-то степени критика, но критика молчаливой быть по моему не должна smile
а так..что минус, что плюс..что синус с косинусом smile

Добавлено через 3 минуты и 28 секунд
Цитата

при эксцепшене в конструкторе автоматически вызывается соответствующий delete без вызова деструктора 

какой еще delete???

Это сообщение отредактировал(а) azesmcar - 9.4.2009, 23:37
PM   Вверх
UnrealMan
Дата 9.4.2009, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lazin @  9.4.2009,  09:48 Найти цитируемый пост)
ну вообще, я там имел ввиду, что во время выполнения тела конструктора, все члены класса уже созданы и к ним можно обращаться

То, что ты имел в виду, было известно лишь тебе и некоторым телепатам. Написал-то ты совсем другое.

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

Объект становится созданным в момент начала его lifetime. В случае наличия нетривиального конструктора объект начинает существовать только после полного отрабатывания его конструктора:

Цитата(3.8 Object Lifetime)
The lifetime of an object is a runtime property of the object. The lifetime of an object of type T begins when:
— storage with the proper alignment and size for type T is obtained, and
— if T is a class type with a non-trivial constructor (12.1), the constructor call has completed.

Если конструктор объекта выбросит исключение, то его деструктор вызываться не будет - как раз потому, что объекта создано не было.

Это и есть общепринятое понимание созданности объекта.

Цитата(zim22 @  9.4.2009,  16:34 Найти цитируемый пост)
что интересней всего, UnrealMan даже не пытается понять точку зрения собеседника.

Мне понятна его точка зрения, а также понятно то, что человек не знает о принятых в C++ соглашениях и поэтому он совершенно не в теме.

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

Это просто у кого-то в глазах двоится smile 

Цитата(zim22 @  9.4.2009,  16:58 Найти цитируемый пост)
Из книжки:

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

Выбрось в топку свою книжку. Явно определённый деструктор всего один, а тело деструктора - это одна из его составных частей, которая выполняется первой:

Цитата(12.4 Destructors)
After executing the body of the destructor and destroying any automatic objects allocated within the body, a destructor for class X calls the destructors for X’s direct members, the destructors for X’s direct base classes and, if X is the type of the most derived class (12.6.2), its destructor calls the destructors for X’s virtual base classes.

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

Кстати, да, инициализированность нестатических членов-данных в момент выполнения тела конструктора в общем случае не гарантируется.


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


Опытный
**


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

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



Цитата(UnrealMan @  9.4.2009,  23:41 Найти цитируемый пост)
Кстати, да, инициализированность нестатических членов-данных в момент выполнения тела конструктора в общем случае не гарантируется.

разве? насклько я понимаю иницализация не выполняетя только для POD типов (если эти мемберы отсутствуют в списке инициализации)


--------------------
user posted image
PM MAIL   Вверх
UnrealMan
Дата 10.4.2009, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(J0ker @  10.4.2009,  00:18 Найти цитируемый пост)
разве? насколько я понимаю инициализация не выполняется только для POD типов (если эти мемберы отсутствуют в списке инициализации) 

Ну, вот ты и привёл причину, по которой выделенное жирным

Цитата(Lazin @  16.3.2009,  22:45 Найти цитируемый пост)
во время выполнения тела конструктора объект уже создан и все переменные объекта инициализированы

в общем случае неверно.
PM MAIL   Вверх
J0ker
Дата 10.4.2009, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(UnrealMan @  10.4.2009,  00:37 Найти цитируемый пост)
в общем случае неверно.

я бы не посчитал это придиркой, если б это поведение отличалось бы от случая POD-объекта вне класса  smile 


--------------------
user posted image
PM MAIL   Вверх
Anikmar
Дата 10.4.2009, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



UnrealMan, как хорошо, что вы решили написать - так гораздо лучше, чем анонимные минусы  smile 

Цитата(UnrealMan @  9.4.2009,  23:41 Найти цитируемый пост)
Объект становится созданным в момент начала его lifetime. В случае наличия нетривиального конструктора объект начинает существовать только после полного отрабатывания его конструктора:

Цитата(3.8 Object Lifetime)
The lifetime of an object is a runtime property of the object. The lifetime of an object of type T begins when:
— storage with the proper alignment and size for type T is obtained, and
— if T is a class type with a non-trivial constructor (12.1), the constructor call has completed.

Если конструктор объекта выбросит исключение, то его деструктор вызываться не будет - как раз потому, что объекта создано не было.

Это и есть общепринятое понимание созданности объекта.


Интересно и как с этим не стыкуется моя фраза:

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

Этим я и имел в виду, что при простейших объектах конструктор может вообще отсутствовать либо в его теле уже можно считать, что он создан. В чем тогда я не прав?
К тому же, если в теле конструктора вылетит исключение, автоматический деструктор вызван будет все равно. А свой деструктор само собой не вызовется.

Цитата(UnrealMan @  9.4.2009,  23:41 Найти цитируемый пост)
Это и есть общепринятое понимание созданности объекта.

Вы все время оперируете только стандартом - теперь общепринятым мнением, как-то нелогично получается. Мнения все разные, просто нужно понимать что делаешь. Все подвести под стандарт нельзя.


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


depict1
****


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

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



Цитата(UnrealMan @  9.4.2009,  23:41 Найти цитируемый пост)
Выбрось в топку свою книжку.

Это велкикая книжка и я верю ей на 100% smile. Другое дело, что перевод русский мог быть корявым smile
вот англ.версия:

An important difference between the destructor and the copy constructor or assignment operator is that even if we write our own destructor, the synthesized destructor is still run. For example, we might write the following empty destructor for class Sales_item:

Код

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



When objects of type Sales_item are destroyed, this destructor, which does nothing, would be run. After it completes, the synthesized destructor would also be run to destroy the members of the class. The synthesized destructor destroys the string member by calling the string destructor, which frees the memory used to hold the isbn. The units_sold and revenue members are of built-in type, so the synthesized destructor does nothing to destroy them.




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


Эксперт
****


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

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



Если говорить на примере, то если выполнить код:
Код

class Bclass
{
    int b;
public:
    Bclass();
    ~Bclass();
};

Bclass::Bclass()
{
    std::cout << "Constructor Bclass\n";
}

Bclass::~Bclass()
{
    std::cout << "Destructor Bclass\n";
}

class Aclass
{
    int a;
    Bclass b;
public:
    Aclass(int pa);
    ~Aclass();
};

Aclass::Aclass(int pa) : a(10/pa)
{
    std::cout << "Constructor Aclass\n";
    throw 1;
}
Aclass::~Aclass()
{
    std::cout << "Destructor Aclass\n";
}

int _tmain(int argc, _TCHAR* argv[])
{
    Aclass *Ac;

    try
    {
        Ac = new Aclass(10);  // Если сюда поставить 0 - у меня напрочь прога зависает не бесконечных исключениях "деление на 0"
        delete Ac;
    }
    catch(...)
    {
    }
    getch();
    return 0;
}



Итак: исключение в конструкторе.
Но деструктор для поля Bclass b; вызывается автоматически. Т.е. все члены класса, которые создаются автоматически - удаляются автоматически даже если в конструкторе возникло исключение.

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


Эксперт
***


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

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



Цитата(Anikmar @  10.4.2009,  12:44 Найти цитируемый пост)
Итак: исключение в конструкторе.
Но деструктор для поля Bclass b; вызывается автоматически. Т.е. все члены класса, которые создаются автоматически - удаляются автоматически даже если в конструкторе возникло исключение.

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

Вобщем пора закругляться с этой темой. 
Никто тут никому ничего не докажет... 
PM MAIL   Вверх
UnrealMan
Дата 10.4.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Anikmar @  10.4.2009,  12:03 Найти цитируемый пост)
Этим я и имел в виду, что при простейших объектах конструктор может вообще отсутствовать либо в его теле уже можно считать, что он создан. В чем тогда я не прав?

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

Цитата(Anikmar @  10.4.2009,  12:03 Найти цитируемый пост)
Вы все время оперируете только стандартом - теперь общепринятым мнением, как-то нелогично получается. Мнения все разные

Слушай, а давай я сейчас напишу на листке бумаги

Цитата
Стандарт C++

Любая программа, написанная на языке C++, должна выводить на экран "C++ - очень плохой язык программирования", и вслед за этим немедленно прекращать своё выполнение.

назову это стандартом C++ и буду всем тут втирать, что вот, согласно стандарту C++, любая программа должна... (и далее по тексту). Мнения по поводу того, что называть стандартом C++, могут быть разные. Ну и в какой цирк тогда превратится форум? Отрицать общепринятые соглашения глупо. Исходя из элементарного здравого смысла, слова автора по умолчанию трактуют общепринятым образом - если автор явным образом не оговорил иное толкование своих слов. Иначе любую фразу можно истолковывать неоднозначно и смысл в общении как таковом отпадает.

Цитата(zim22 @  10.4.2009,  12:31 Найти цитируемый пост)
Это велкикая книжка и я верю ей на 100%

Аминь. Только не думай, что другие тоже должны верить твоей Священной Книге. Самый достоверный источник правил C++ - это стандарт вместе с приведёнными на http://www.open-std.org/jtc1/sc22/wg21/ исправлениями технических опечаток.

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


depict1
****


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

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



Цитата(UnrealMan @  10.4.2009,  16:30 Найти цитируемый пост)
Самый достоверный источник правил C++ - это стандарт 

я не спорю. но мне его ещё рано читать. Перед тем, как научиться бегать неплохо бы освоить ходьбу smile


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


Эксперт
****


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

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



Цитата(UnrealMan @  10.4.2009,  16:30 Найти цитируемый пост)
В том, что ты апеллируешь к собственновыдуманному пониманию созданности объекта, игнорируя общепринятое.

Перевожу на русский язык эту фразу и не понимаю:

В том, что ты [апеллируешь][обжалуешь] к собственновыдуманному пониманию созданности объекта, игнорируя общепринятое
Это не издевательство - я не понял в каком контексте используется слово "апеллируешь"

Как я понял, моя вина в том, что я имею собственное мнение игнорируя общепринятое?

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

зы. 
Цитата

Бегом читать стандарт (п. 3.8 Object Lifetime)

Мы с вами водки вместе не пили, вы не моя жена и не мой начальник, так что что мне делать, когда, бегом или шагом я решаю сам. Если вежливо разговаривать вам мешает стандарт - то я принимаю это к сведению, а если отсутствие воспитания - то сочувствую.


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

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

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

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

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


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

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


 




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


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

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