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

Поиск:

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


depict1
****


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

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



Lazin  написал в одной теме, что
Цитата

во время выполнения тела конструктора объект уже создан и все переменные объекта инициализированы

но получил за этот пост минус от UnrealMan с комментарием: 
Цитата

Во время выполнения тела конструктора объект ещё не создан.


Но я тут книжечку почитывал и теперь у меня сомнения, прав ли был UnrealMan... Разъясните пожалуйста.

Там такой пример был:
Код

class ZooAnimal { };
class Endangered { };
class Bear : public ZooAnimal { };
class Panda : public Bear, public Endangered { };


For Panda, the order of base-class initialization is:
  • ZooAnimal, the ultimate base class up the hierarchy from Panda's immediate base class Bear
  • Bear, the first immediate base class
  • Endangered, the second immediate base, which itself has no base class
  • Panda; the members of Panda itself are initialized, and then the body of its constructor is run.


Плюс в стандарте (пункт 12.6.5) сказано, что сначала инициализируются все переменные объекта, а только потом выполняется тело конструктора

Цитата

Initialization shall proceed in the following order:

— First, and only for the constructor of the most derived class as described below, virtual base classes shall be
  initialized in the order they appear on a depth-first left-to-right traversal of the directed acyclic graph of base
  classes, where “left-to-right” is the order of appearance of the base class names in the derived class base-specifier-list.

— Then, direct base classes shall be initialized in declaration order as they appear in the base-specifier-list (regardless
  of the order of the mem-initializers).

— Then, non-static data members shall be initialized in the order they were declared in the class definition (again
  regardless of the order of the mem-initializers).

— Finally, the body of the constructor is executed.



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


Эксперт
***


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

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



Цитата(zim22 @  9.4.2009,  09:33 Найти цитируемый пост)
о я тут книжечку почитывал и теперь у меня сомнения, прав ли был UnrealMan... Разъясните пожалуйста.

технически прав. Создание объекта - есть выделение памяти + инициализация. Инициализация - это и есть вызов конструктора. Хотя конечно когда выполняется конструктор, уже все объекты этого объекта созданы и, если предусмотрено, проинициализированы какими-то своими конструкторами. Вобщем считается, что создание объекта заканчено после вызова конструктора

Добавлено через 4 минуты и 40 секунд
тут по большему счету вопрос терминологии. Называть объект созданным во время вызова конструктора или НЕсозданным, я например, особого значения не придаю. Главное понимать что происходит.  
PM MAIL   Вверх
Lazin
Дата 9.4.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ну вообще, я там имел ввиду, что во время выполнения тела конструктора, все члены класса уже созданы и к ним можно обращаться, ведь речь шла о использовании членов класса в конструкторе, а не о том, когда объект считается созданым smile 
PM MAIL Skype GTalk   Вверх
Anikmar
Дата 9.4.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


C точки зрения первого взгляда на тему, я сразу подумал именно о том, что имел в виду Lazin. Считать объект созданым можно, по-разному конечно, но в теле конструктора можно быть уверенным, что под объект выделена память.
Например, если конструктор выглядит так:
Код

class MyClass
{
  int AField;
  int BField;
public: 
  MyClass();
};

MyClass::MyClass() : AField(5),BField(7)
{
// Тело конструктора и все поля проинициализированы
// Считать здесь объект созданным или нет?
}


Так что весьма спорный момент и минус ставить считаю неправильным.
PM MAIL ICQ   Вверх
zim22
Дата 9.4.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



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

Понял. Тогда всё правильно smile Инициализация членов не есть создание объекта %)



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


Эксперт
***


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

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



Да сначала инициализируются все переменные  потом выполняется тело конструктора, так как в конструкторе можно уже обращаться к переменным класса.

zim22
что ты считаешь объектом ? 

Это сообщение отредактировал(а) Dem_max - 9.4.2009, 10:00


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
zim22
Дата 9.4.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Anikmar @  9.4.2009,  09:58 Найти цитируемый пост)
Так что весьма спорный момент и минус ставить считаю неправильным.

Да-восторжествует справедливость! Lazin, +1

Добавлено через 1 минуту и 8 секунд
Цитата(Dem_max @  9.4.2009,  09:59 Найти цитируемый пост)
что ты считаешь объектом ? 

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


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


Эксперт
***


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

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



Цитата(zim22 @  9.4.2009,  09:59 Найти цитируемый пост)
Понял. Тогда всё правильно smile Инициализация членов не есть создание объекта %)

не надо бросаться в крайности. Инициализация - это не только список инициализации. Объект может иметь, например некий буфер, память под который выделяется внутри конструктора. И с логической точки зрения пока этот буфер не выделен, объект еще использовать нельзя и какие-то интерфейсные функции, например, еще нельзя вызывать. 
 
Кстати, насколько я помню, создание = память + инициализация - это есть в стандарте
PM MAIL   Вверх
Dem_max
Дата 9.4.2009, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

MyClass::MyClass() : AField(5),BField(7)
{
// Тело конструктора и все поля проинициализированы
// Считать здесь объект созданным или нет?

}

Я думаю перед закрывающейся скобкой да, можно считать созданным.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
zim22
Дата 9.4.2009, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(Fazil6 @  9.4.2009,  10:13 Найти цитируемый пост)
Объект может иметь, например некий буфер, память под который выделяется внутри конструктора. И с логической точки зрения пока этот буфер не выделен, объект еще использовать нельзя

Спорный какой-то вопрос. А если объект не имеет буфера и не выделяет дополнительно никакую память? То он является созданным? или нет?


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


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


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

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



Цитата(zim22 @  9.4.2009,  09:17 Найти цитируемый пост)
Цитата

Объект может иметь, например некий буфер, память под который выделяется внутри конструктора. И с логической точки зрения пока этот буфер не выделен, объект еще использовать нельзя

Спорный какой-то вопрос.

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


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


Эксперт
****


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

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



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

а как ты собираешься обращаться к не полностью созданному объекту, иначе чем в теле конструктора? 
PM MAIL Skype GTalk   Вверх
zim22
Дата 9.4.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



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

так:
Код
int func(int x) { return 10; }

class Foo {
public:  
  Foo(int val) : x(func(val)) {  }
private:
  int x;
};

int _tmain(int argc, _TCHAR* argv[])
{
  Foo f1(5);
    return 0;
}



**************
более нагляден этот пример:
Код

typedef void (*fcn)();

int func(fcn par1) { 
  par1(); 
  return 10; 
}

class Foo {
public:  
  Foo() : x(func(print)) { }  
  void print() { std::cout << x; }  
private:
  int x;
};



только не компилится smile
error C3867: 'Foo::print': function call missing argument list; use '&Foo::print' to create a pointer to member

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


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


Эксперт
****


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

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



Цитата(Fazil6 @  9.4.2009,  10:13 Найти цитируемый пост)
Кстати, насколько я помню, создание = память + инициализация - это есть в стандарте 

Стандартизировать это сложно.

Что есть инициализация? Для простых переменных - присваивание начального значения, можно вне тела конструктора.
Для буферов - можно в конструкторе, у меня всегда отдельным методом Init

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

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


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


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

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



Цитата(zim22 @  9.4.2009,  09:35 Найти цитируемый пост)
только не компилится smile
error C3867: 'Foo::print': function call missing argument list; use '&Foo::print' to create a pointer to member

Код

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)) { }
  void print() { std::cout << x; }

private:
  int x;
};



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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