Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,594
Записей в блоге: 28
#1

Порядок инициализации полей в конструкторе - C++

05.08.2010, 21:30. Просмотров 3105. Ответов 10
Метки нет (Все метки)

Имеется некий класс T. В нём имеются поля m_F1 (указатель) и m_F2 (неважно). Конструктор выглядит так:

C++
1
2
3
T::T()
  : m_F1 (new ...),
    m_F2 (m_F1->...)
В момент инициализации поля m_F2 оказывается, что m_F1 неинициализировано. Я правильно понимаю, что при такой инициализации стандарт не гарантирует порядок инициализации полей? Или я что-то не так делаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2010, 21:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Порядок инициализации полей в конструкторе (C++):

Ошибка при попытке инициализации входных параметров в конструкторе - C++
Доброго времени. При попытке инициализировать поле State макроопределением компилятор выдаёт ошибку. При инициализации константой всё...

Создание массива объектов класса через список инициализации в конструкторе композита - C++
Может, просто плохо искала, но не могу найти. Есть класс, атрибутом которого является массив объектов другого класса. Как составить...

Порядок инициализации предков - C++
class A {...}; class B {...}; class C : A,B { private: int Var; public: C(const int &v) : A(&Var), B(&Var) {...

Порядок переменных в списке инициализации - C++
Есть класс, в нем 2 поля ссылка и bool, если в списке инициализации написать так :ссылка(NULL),bool(true) то компилятор выдает...

Порядок инициализации членов класса - C++
Здравствуйте форумчане. Столкнулся с проблемой. Не могу найти доходчивой статьи на данный вопрос про инициалиазцию членов в классе. ...

Порядок инициализации переменных в одном объявлении - C++
Есть оператор объявления переменных (надеюсь, правильно назвал) int ..., sr = n / 2 + n % 2 - 1, tl = n / 2 + n % 2, ...; Можно ли его...

10
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
05.08.2010, 21:55 #2
Нет, неправильно. Стандарт гарантирует, что поля (члены) класса инициализируются строго в порядке их объявления в классе, и никак иначе, независимо от порядка их перечисления в списке инициализации.
2
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,594
Записей в блоге: 28
05.08.2010, 22:11  [ТС] #3
ОО!! понял. Спасибо

Добавлено через 1 минуту
А есть идеи, почему порядок привязан к описанию в классе, а не к порядку описания в инициализации?
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.08.2010, 22:27 #4
Думаю, здесь две причины:
1. Поля лежат в памяти в порядке объявления и в нем же должны инициализироватся.
2. Списоков инициализации может быть много, а объявление только одно.
Возможно есть и более веские причины.
0
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,594
Записей в блоге: 28
05.08.2010, 22:40  [ТС] #5
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
1. Поля лежат в памяти в порядке объявления и в нем же должны инициализироватся.
2. Списоков инициализации может быть много, а объявление только одно
Если честно, то ни в том, ни в другом не вижу логики. Если инициализацию написать внутри фигурных скобок в виде операций присваивания, то там порядок будет тот, какой нужно. Во всяком случае там, где одно поле зависит от другого. Не вижу объективных причин, почему не делать так же и при инициализации после двоеточия (вне фигурных скобок)
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.08.2010, 22:44 #6
Evg, дело в другом. Когда ты присваиваешь значения полям внутри конструктора, а не в списке инициализации - это именно присваивание, а не инициализация. Инициализация полей к этому времени уже закончена: все неинициализированные в списке инициализации поля встроенного типа остались неинициализорованными, для полей же пользовательских типов были вызваны конструкторы по умолчанию.
2
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,594
Записей в блоге: 28
05.08.2010, 22:52  [ТС] #7
При таком раскладе более-менее понятно. Но всё равно как-то неудобно. Очередное место в Си++, где чтобы понять, что делается в одном месте, надо сначала посмотреть в другое место. С таким подходом радостью бы плюнул на инициализацию через двоеточие, но поле const
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.08.2010, 23:08 #8
Evg, почему же, все логично. Просто не нужно полагаться на какой либо порядок в списке инициализации.
0
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,594
Записей в блоге: 28
05.08.2010, 23:37  [ТС] #9
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Просто не нужно полагаться на какой либо порядок в списке инициализации
Ситуация такая. Оба поля имеют модификатор const, а потому их можно инициализировать только через двоеточие - нормальное явление. Инициализация полей зависит друг от друга - тоже нормальное явление. Если бы в поле с модификатором const разрешалось писать внутри конструктора - всё было бы нормально (на мой взгляд такое поведение разумно, но может в идеологию не укладывается). Но писать нельзя, а потому приходится извращаться. Я понимаю, что в Си и того нет, но всё-равно как-то через ж...у получается.
0
CyBOSSeR
Эксперт С++
2304 / 1674 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.08.2010, 23:57 #10
Evg, если можно - покажи отрывок кода с инициализацией, возможно что-нибудь получится придумать.
0
Evg
Эксперт CАвтор FAQ
18241 / 6366 / 435
Регистрация: 30.03.2009
Сообщений: 17,594
Записей в блоге: 28
06.08.2010, 00:06  [ТС] #11
Да я через порядок полей в классе проблему решил. Я просто высказываю очередное недовольство языком Си++

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TContext { ... };
class TTable { ... };
 
class T3
{
  ...
  TContext * const m_Context;
  TTable * const m_Table1;
  TTable * const m_Table2;
  ...
};
 
T3::T3 (int param)
  : m_Context (new TContext (param)),
    m_Table1 (m_Context->CreateTable (1)),
    m_Table2 (m_Context->CreateTable (2))
{
  ...
}
0
06.08.2010, 00:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2010, 00:06
Привет! Вот еще темы с ответами:

Что такое порядок инициализации таблицы виртуальных методов? - C++
Что-то я не переварил это.

Определить конструктор для инициализации полей по умолчанию - C++
У меня такое задание по лабу, кстати она самая сложная и последняя: дана структура: struct Student { char *LastName; ...

Как реализовать конструктор с параметрами для инициализации полей класса? - C++
Подскажите как реализовать конструктор с параметрами для инициализации полей класса.

Порядок отрицательных членов изменить на обратный, порядок неотрицательных сохранить - C++
Задача (нужно все 3 пункта в 1 программе сделать) Прошу Помочь В условиях задания 3 а) порядок отрицательных членов изменить на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru