Рубрики

Делегирование конструктора в C ++

Иногда для конструктора полезно иметь возможность вызывать другой конструктор того же класса. Эта функция, называемая Constructor Delegation , была представлена в C ++ 11.

Пример программы без делегирования:

// Программа на C ++ для демонстрации необходимости
// конструктор делегирования.
#include <iostream>

using namespace std;

  

class A {

    int x, y, z;

  

public:

    A()

    {

        x = 0;

        y = 0;

        z = 0;

    }

    A(int z)

    {

        // две строки ниже избыточны

        x = 0;

        y = 0;

  

        / * Инициализировать z только путем передачи аргумента,

           в то время как все остальные аргументы

           инициализированы так же, как они были,

           как в предыдущем конструкторе * /

        this->z = z;

    }

  

    void show()

    {

        cout << x << '\n'

             << y << '\n'

             << z;

    }

};

  

int main()

{

    A obj(3);

    obj.show();

    return 0;

}

Выход:

0
0
3

Решение проблемы избыточного кода с помощью init ()
В приведенном выше примере мы видим, что конструкторы указанного класса, несмотря на наличие разных сигнатур, имеют первые две общие строки кода, что приводит к дублированию кода. Одним из решений этой проблемы, чтобы избежать этой ситуации, было бы создание функции init, которую можно вызывать из обоих конструкторов.

// Программа для демонстрации использования init () для
// избегаем избыточного кода.
#include <iostream>

using namespace std;

  

class A {

    int x, y, z;

  

    // функция init для инициализации x и y

    void init()

    {

        x = 0;

        y = 0;

    }

  

public:

    A()

    {

        init();

        z = 0;

    }

    A(int z)

    {

        init();

        this->z = z;

    }

  

    void show()

    {

        cout << x << '\n'

             << y << '\n'

             << z;

    }

};

  

int main()

{

    A obj(3);

    obj.show();

    return 0;

}

Выход:

0
0
3

Решение проблемы избыточного кода с помощью делегирования конструктора ()
Хотя использование функции init () исключает дублирование кода, у нее все же есть свои недостатки. Во-первых, он не так удобен для чтения, поскольку добавляет новую функцию и несколько новых вызовов функций. Во-вторых, поскольку init () не является конструктором, его можно вызывать во время обычного программного потока, где переменные-члены уже могут быть установлены, а динамически распределенная память уже может быть выделена. Это означает, что init () должен быть дополнительно сложным, чтобы правильно обрабатывать как новые случаи инициализации, так и повторной инициализации.

Однако делегирование конструктора C ++ предоставляет элегантное решение для решения этой проблемы, позволяя нам вызывать конструктор, помещая его в список инициализаторов других конструкторов. Следующая программа демонстрирует, как это делается:

// Программа для демонстрации делегирования конструктора
// в C ++
#include <iostream>

using namespace std;

class A {

    int x, y, z;

  

public:

    A()

    {

        x = 0;

        y = 0;

        z = 0;

    }

  

    // Делегирование конструктора

    A(int z) : A()

    {

        this->z = z; // Обновлять только z

    }

  

    void show()

    {

        cout << x << '\n'

             << y << '\n'

             << z;

    }

};

int main()

{

    A obj(3);

    obj.show();

    return 0;

}

Выход:

0
0
3

Очень важно отметить, что делегирование конструктора отличается от вызова конструктора из тела другого конструктора, что не рекомендуется, потому что это создает другой объект и инициализирует его, не делая ничего для объекта, созданного конструктором, который его вызвал ,

Рекомендуемые посты:

Делегирование конструктора в C ++

0.00 (0%) 0 votes