Две разные инициализации переменных в классе C ++. Какая разница? - PullRequest
1 голос
/ 03 марта 2020

Я начинающий самоучка, поэтому, я думаю, я собираюсь спросить кое-что довольно простое c, и это, тем не менее, я игнорирую.

Предположим, у вас есть класс с именем aClass в C ++ и один из конструкторов требует параметра. В чем разница между этими двумя подходами?

1-й:

aClass::aClass(int aVariable) : privateVariable(aVariable) {}

2-й:

aClass::aClass(int aVariable) {
    privateVariable = aVariable;
}

Если это в основном одно и то же, какой из двух чаще? Как вариант, по какой причине люди склонны использовать вместо других?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 марта 2020

Первый выполняет инициализацию и должен быть предпочтительным.

Второй выполняет назначение (после инициализации по умолчанию). в основном это эквивалентно:

aClass::aClass(int aVariable) : privateVariable() {
    privateVariable = aVariable;
}

Так что не работает, если privateVariable не является конструктивным по умолчанию.

2 голосов
/ 03 марта 2020

Даже если на этот вопрос уже есть принятый ответ, давайте немного уточним.

Давайте приведем пример, в котором один работает, а другой нет:

class Foo
{
    public:
        Foo(int value);
    private:
        Foo();
        int content;
};

class Bar
{
    public:
        Bar(int value);
    private:
        Foo foo;
};

A рабочая реализация конструктора будет

Bar::Bar(int value) : foo(value) {}

Если, однако, вам будет go нравится

Bar::Bar(int value) 
{
    foo = Foo(value);
}

Что произойдет, если это не скомпилируется. В качестве демонстрации я создал http://cpp.sh/2vfwqk, посмотрим, что произойдет, если вы попытаетесь запустить его. Затем откомментируйте нижнюю реализацию и закомментируйте вышеприведенную.
Дело в том, что Foo() необходимо будет вызвать, прежде чем он сможет начать обрабатывать тело, поскольку foo необходимо инициализировать.
И список инициализатора делает это напрямую.

(Пример также сработает, если вместо того, чтобы сделать пустой конструктор закрытым, я полностью его опущу, но так легче понять).

Другое дело, что если бы Foo() было бы опубликовано c, он бы создал два объекта. Если они легкие, нет проблем, но если пустой конструктор требует большого объема памяти или времени, что нежелательно.

И это в значительной степени необходимо для членов, которые являются ссылками.
Может быть, стоит прочитать для вас : https://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/

...