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

Вот пример того, что кажется «старым» способом работы:

class Example
{
public:
    // Set "m_x" to "x", "m_y" gets set to the default value of 5
    Example(int x) : m_x(x), m_y(5)
    {
    }

private:
    int m_x;
    int m_y;

};

И, насколько я понимаю, сейчас люди рекомендуют следующее:

class Example
{
public:
    Example(int x) : m_x{x}
    {
    }

private:
    int m_x{0}; // Supposedly {} works too? I guess this would
                // only be necessary if I had another constructor
                // taking in 0 arguments, so "m_x" doesn't go uninitialized
    int m_y{5};

};

Мой вопрос: как это влияет на указатели, ссылки и некоторые классы STL? Какая для них лучшая практика? Они просто инициализируются с помощью {}? Кроме того, следует ли мне делать это, даже если конструктор все равно инициализирует переменные? (т.е. запись m_x{}, даже если конструктор все равно устанавливает что-то другое)

Спасибо.

0
K.K. Slider 26 Фев 2018 в 07:47

1 ответ

Лучший ответ

Вы можете использовать инициализацию членов класса и делегировать конструкторы, чтобы уменьшить дублирование кода. См. Мой ответ на связанный вопрос: Рефакторинг с помощью C ++ 11.

Переменные-члены типов указателей могут быть инициализированы как nullptr с помощью инициализации члена класса. Инициализация указателей на что-то еще с использованием инициализации членов класса кажется бесполезной. Вам придется судить об этом для вашего конкретного случая использования.

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

Re. классы из стандартной библиотеки ... Конечно, вы можете инициализировать типы контейнеров, используя инициализацию членов класса. Следующий класс - это прекрасно.

struct Foo
{
    std::vector<int> ar = {20};
};
1
R Sahu 26 Фев 2018 в 08:04