В классе C ++, вы должны инициализировать переменные-члены, которые являются массивами? - PullRequest
0 голосов
/ 31 октября 2018

Например:

class Cls
{
private:
    int x;
    int y;
    int arr[10];

public:
    Cls();
};

Cls::Cls() : x(0), y(0) {}

Насколько я понимаю, неинициализированный массив будет иметь значения мусора. Пока я не пишу код, который ожидает, что массив будет иметь определенное значение перед заполнением, есть ли проблема с не инициализацией массива? Или мне нужно что-то подобное в качестве конструктора:

Cls::Cls() : x(0), y(0), arr() {}

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Если ваша логика такова, что вы определенно не будете писать код, который обращается к ним до их установки, то нет необходимости инициализировать их. Например, если вы не используете массив вообще, вы можете просто оставить их унифицированными.

Однако лучше всего инициализировать их, так как нет причин не делать этого, даже если вы инициализируете их для плохих значений. Может случиться так, что хотя вы всегда пишете перед чтением сейчас , это может измениться в будущем. Через 6 месяцев кто-то может что-то реорганизовать, и теперь перед записью происходит чтение. Поскольку это неопределенное поведение, возможно, ваша программа будет работать правильно, или она могла бы работать на их компьютере, но зависать на другом. Если вы их инициализируете, у вас просто не будет этих проблем.

Возможно, вы обеспокоены тем, что 0 является допустимым значением, и вы не хотите, чтобы ваша программа случайно получила это значение, вы бы лучше дали понять, что оно не инициализировано должным образом, но с неопределенным поведением вы можете получить 0 или какое-то другое допустимое значение или сбой, и он может быть несовместимым. Вы, вероятно, поблагодарите себя, если просто все правильно инициализируете.

Полиция C ++ или компилятор не помешает вам сделать это, и ваша программа все еще может быть хорошо сформирована, но вы можете также гарантировать ее, просто инициализируя их.

0 голосов
/ 31 октября 2018

Конструктор Cls не требуется для инициализации члена массива. Если его не инициализировать, элементы останутся с неопределенными значениями. Вопреки распространенному мнению, объекты с неопределенными значениями не являются просто объектами, значения которых не определены; на самом деле, попытка прочитать их, прежде чем записывать в них определенные значения, вызывает неопределенное поведение. По этой причине обычно рекомендуется устанавливать значения как можно скорее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...