Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Инициализация вектора в конструкторе

#cpp #классы #конструктор #инициализация


class A {
public:
 A(size_t size):vector(size, default_value){}

private:
 std::vector vector;
 const int default_value = -1;
}


Почему вектор инициализируется рандомным значением? Константа ещё не успевает стать
-1? Как тогда сделать правильно?
    


Ответы

Ответ 1



Да, раз Вы проводите инициализацию в списке инициализации, то надо строчку с константой вынести выше, поскольку операция конструирования полей класса происходит в порядке из записи. У Вас еще неизвестно значение этой константы. Поэтому сделайте минимум так: class A { public: A(size_t size) : vector(size, default_value) {} private: сonst int default_value = -1; std::vector vector; }

Ответ 2



Члены класса инициализируются в порядке их объявления в классе. Поэтому для этого определения класса class A { public: A(size_t size):vector(size, default_value){} private: std::vector vector; const int default_value = -1; }; член данных vector инициализируется, когда член данных default_value еще не был инициализирован. Если переставить эти члены данных местами, то программа будет иметь ожидаемое поведение #include #include class A { public: A( size_t size ) : vector( size, default_value ) { } friend std::ostream & operator <<( std::ostream &, const A & ); private: const int default_value = -1; std::vector vector; }; std::ostream & operator <<( std::ostream &os, const A &a ) { for ( int x : a.vector ) std::cout << x << ' '; return os; } int main() { A a( 10 ); std::cout << a << std::endl; return 0; } Вывод программы на консоль -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 Из стандарта C++ (12.6.2 Initializing bases and members) 13 In a non-delegating constructor, initialization proceeds in the following order: ... 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). Если бы вы объявили член данных default_value как статический член данных класса, то тогда инициализация нестатического члена данных vector не зависела бы от порялка объявления этих членов данных, так как статические члены класса инициализируются до создания любого объекта класса. class A { public: A( size_t size ) : vector( size, default_value ) { } friend std::ostream & operator <<( std::ostream &, const A & ); private: std::vector vector; static const int default_value = -1; };

Комментариев нет:

Отправить комментарий