class A {
public:
A(size_t size):vector(size, default_value){}
private:
std::vector<int> vector;
const int default_value = -1;
}
Почему вектор инициализируется рандомным значением? Константа ещё не успевает стать -1? Как тогда сделать правильно?
Да, раз Вы проводите инициализацию в списке инициализации, то надо строчку с константой вынести выше, поскольку операция конструирования полей класса происходит в порядке из записи. У Вас еще неизвестно значение этой константы. Поэтому сделайте минимум так:
class A
{
public:
A(size_t size)
: vector(size, default_value) {}
private:
сonst int default_value = -1;
std::vector<int> vector;
}
Члены класса инициализируются в порядке их объявления в классе. Поэтому для этого определения класса
class A {
public:
A(size_t size):vector(size, default_value){}
private:
std::vector<int> vector;
const int default_value = -1;
};
член данных vector инициализируется, когда член данных default_value еще не был инициализирован.
Если переставить эти члены данных местами, то программа будет иметь ожидаемое поведение
#include <iostream>
#include <vector>
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<int> 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:
...
Если бы вы объявили член данных 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<int> vector;
static const int default_value = -1;
};
Сборка персонального компьютера от Artline: умный выбор для современных пользователей