Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
#1

Порядок переменных в списке инициализации - C++

20.01.2013, 23:51. Просмотров 555. Ответов 16
Метки нет (Все метки)

Есть класс, в нем 2 поля ссылка и bool, если в списке инициализации написать так

C++
1
:ссылка(NULL),bool(true)
то компилятор выдает варнинг и пишет, что сначала инициализирует bool, а потом ссылку. почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 23:51     Порядок переменных в списке инициализации
Посмотрите здесь:

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

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

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

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

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

Перехватывание исключений в списке инициализации - C++
Здравствуйте! Я выделяю память в конструкторе, в списке инициализации. S::S() : k { new K() } { } Возможно ли перехватить...

Обработка исключений в списке инициализации конструктора - C++
Доброго времени суток. Имеем код: #include <iostream> #include "windows.h" #include <fstream> using namespace std; class...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
20.01.2013, 23:54     Порядок переменных в списке инициализации #2
Цитата Сообщение от defer Посмотреть сообщение
ссылка(NULL)
А Вы думаете, это вообще компилятор проглотит?
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.01.2013, 23:54     Порядок переменных в списке инициализации #3
потому что инициализация всё равно происходит в том порядке в котором записаны объявления к классе/структуре
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
21.01.2013, 00:06  [ТС]     Порядок переменных в списке инициализации #4
Цитата Сообщение от Croessmah Посмотреть сообщение
А Вы думаете, это вообще компилятор проглотит?
Это условный код
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,288
Записей в блоге: 17
21.01.2013, 02:27     Порядок переменных в списке инициализации #5
Ссылка или указатель ?
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
21.01.2013, 02:45  [ТС]     Порядок переменных в списке инициализации #6
Цитата Сообщение от Avazart Посмотреть сообщение
Ссылка или указатель ?
указатель
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,288
Записей в блоге: 17
21.01.2013, 02:52     Порядок переменных в списке инициализации #7
Тогда что за компилятор, и что конкретно пишит ?
C++
1
2
3
4
5
6
struct test
{
     bool b;
     int* p;
     test():p(NULL),b(true){}
};
Лично у меня RAD XE не выдает предупреждений.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.01.2013, 02:57     Порядок переменных в списке инициализации #8
Цитата Сообщение от Avazart Посмотреть сообщение
Лично у меня RAD XE не выдает предупреждений.
а скаких пор это эталон поддержки стандарта?
Цитата Сообщение от Avazart Посмотреть сообщение
Тогда что за компилятор, и что конкретно пишит ?
gcc/clang пишут варнинги
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
21.01.2013, 03:00     Порядок переменных в списке инициализации #9
MinGW варнинг выдает с опций -Wall
а так молчит.
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,288
Записей в блоге: 17
21.01.2013, 03:16     Порядок переменных в списке инициализации #10
Цитата Сообщение от Jupiter Посмотреть сообщение
а скаких пор это эталон поддержки стандарта?
А кто говорил о каком либо стандарте? Вопрос - почему ?
Да и вообще какое отношение имеет предупреждение компилятора к стандарту языка ?
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
21.01.2013, 03:23     Порядок переменных в списке инициализации #11
Цитата Сообщение от defer Посмотреть сообщение
Это условный код
Напиши нормальный код. И по-нормальному ворнинг.
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,288
Записей в блоге: 17
21.01.2013, 03:29     Порядок переменных в списке инициализации #12
Кстати в VC++2010 тоже без предупреждений
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.01.2013, 03:32     Порядок переменных в списке инициализации #13
Цитата Сообщение от Avazart Посмотреть сообщение
Да и вообще какое отношение имеет предупреждение компилятора к стандарту языка ?
12.6.2.10 n3242
Initialization In a non-delegating constructor, initialization proceeds in the following order:
— First, and only for the constructor of the most derived class (1.8), virtual base classes are 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 classes in the derived class base-specifier-list.
— Then, direct base classes are 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 are initialized in the order they were declared in the class definition
(again regardless of the order of the mem-initializers).
в 2003-м - 12.6.2.5
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,288
Записей в блоге: 17
21.01.2013, 03:46     Порядок переменных в списке инициализации #14
Ээ Я что-то пропустил ? Где тут про предупреждения и списки инициализации ?

Или скажем иначе что может быть ошибочного в "обратной" записи в списке ?
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.01.2013, 03:50     Порядок переменных в списке инициализации #15
Цитата Сообщение от Avazart Посмотреть сообщение
Или скажем иначе что может быть ошибочного в "обратной" записи в списке ?
то что автор кода не знает каков порядок инициализации на самом деле и может накосячить
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,288
Записей в блоге: 17
21.01.2013, 03:54     Порядок переменных в списке инициализации #16
Я имею виду что, как я понимаю, стандарт не говорит какие предупреждения выдавать компилятору - это во первых.
Во вторых что компилятору может не нравится что он ворчит ? ( но работает)
Типа жалуется на тяжелую жизнь его парсера ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2013, 05:15     Порядок переменных в списке инициализации
Еще ссылки по теме:

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

Инициализация в теле конструктора или в списке инициализации. - C++
Здрасте. class random1 { public: random(): a(5) {} private: int a; };

Копирующий конструктор в списке инициализации членов класса - C++
Добрый день. Сегодня обнаружил кое-что для себя странное и непонятное. В общем-то смотрим код: #include <iostream> ...

Ошибка инициализации переменных - C++
#include <iostream> #include <math.h> #include <conio.h> using namespace std; double f(double x) { return ...

Инициализация в теле конструктора или в списке инициализации, есть ли разница в сгенерированном коде? - C++
Инициализация в теле конструктора или в списке инициализации - большая ли разница в сгенерированном коде? И есть ли она вообще?


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

Или воспользуйтесь поиском по форуму:
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
21.01.2013, 05:15     Порядок переменных в списке инициализации #17
Жалуется на то, что могут быть ошибки, если есть зависимость инициализации между объектами. К примеру:
C++
1
2
3
4
5
6
7
class A {
 ...
 private:
   int *ptr;
   int size;
 ...
};
C++
1
2
3
4
5
6
A::A( int s )
   : size( s ),
     ptr( new int [ size ])
{
   
}
В данном случае на момент инициализации ptr в переменной size мусор, потому что она объявлена после ptr в объявлении класса.
Yandex
Объявления
21.01.2013, 05:15     Порядок переменных в списке инициализации
Ответ Создать тему
Опции темы

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