Перегрузка операторов. Что не так с этим простым шаблоном класса C ++?

Следующий фрагмент находится в заголовочном файле:

// Represents NxN scalar values (aka square matrix).
template<std::size_t N>
class dummy
{
public:
float& operator[](const std::size_t ind) { return scalars[ind]; }

private:
float scalars[N*N];
};

using dummy2 = dummy<2>;

И вот как я бы это использовал:

// 2x2=4 floats
dummy2 d;

std::cout << d[0] << std::endl; // prints 0
std::cout << d[1] << std::endl; // prints 0
std::cout << d[2] << std::endl; // prints -1.42253e+19
std::cout << d[3] << std::endl; // prints 4.59163e-41

Мой вопрос: почему последние два вызова печати не приводят к нулевому значению?

1

Решение

Вы не предоставили конструктор для своего класса, поэтому компилятор генерирует конструктор по умолчанию, который по умолчанию инициализирует всех членов класса. Инициализация по умолчанию встроенного типа означает, что он вообще не инициализирован, поэтому любое использование его значения не определено. Другими словами, scalars не инициализируется ни к чему.

Вы можете исправить это так:

template<std::size_t N>
class dummy
{
public:
float& operator[](const std::size_t ind) { return scalars[ind]; }

dummy() : scalars()
{}

private:
float scalars[N*N];
};

using dummy2 = dummy<2>;

Это делает scalars значение инициализируется вместо значения по умолчанию, и значение инициализируется float устанавливает его 0.f, так что все будет работать.

Живой пример

4

Другие решения

scalars не инициализируется явно. Первые два нуля на самом деле являются результатом неопределенного поведения, поэтому вы должны установить массив в ноль в конструкторе.

1

По вопросам рекламы [email protected]