Рубрики

Вывод программы C ++ | Набор 13

Предсказать вывод следующей программы на C ++.

#include<iostream>

using namespace std;

  

class A

{

    // данные членов A

public:

    A ()           { cout << "\n A's constructor"; / * Инициализировать данные членов * / }

    A (const A &a) { cout << "\n A's Copy constructor"/ * копировать данные членов * /}

    A& operator= (const A &a) // Назначаем оператора

    {

        // Обрабатываем самостоятельное назначение:

        if(this == &a) return *this;

  

        // Копируем данные членов

        cout << "\n A's Assignment Operator"return *this;

    }

};

  

class B

{

    A a;

    // Другие члены Б

public:

    B(A &a) { this->a = a; cout << "\n B's constructor"; }

};

  

int main()

{

    A a1;

    B b(a1);

    return 0;

}

Выход:

 A's constructor
 A's constructor
 A's Assignment Operator
 B's constructor

Первая строка вывода выводится оператором «A a1;» в main ().
Вторая строка печатается, когда элемент B 'a' инициализируется. Это важно.
Третья строка печатается оператором «this-> a = a;» в конструкторе B.
Четвертая строка печатается оператором cout в конструкторе B.

Если мы поближе рассмотрим приведенный выше код, конструктор класса B неэффективен, так как член 'a' сначала создается с помощью конструктора по умолчанию, а затем значения из параметра копируются с использованием оператора присваивания. Это может быть проблемой, когда класс А большой, что обычно имеет место со многими практическими занятиями. Смотрите следующий оптимизированный код.

#include<iostream>

using namespace std;

  

class A

{

    // данные членов A

public:

    A()           { cout << "\n A's constructor"; / * Инициализировать данные членов * / }

    A(const A &a) { cout << "\n A's Copy constructor"; / * Копировать данные членов * / }

    A& operator= (const A &a) // Назначаем оператора

    {

        // Обрабатываем самостоятельное назначение:

        if(this == &a) return *this;

  

        // Копируем данные членов

        cout << "\n A's Assignment Operator"return *this;

    }

};

  

class B

{

    A a;

    // Другие члены Б

public:

    B(A &a):a(a) {  cout << "\n B's constructor"; }

};

  

int main()

{

    A a;

    B b(a);

    return 0;

}

Выход:

 A's constructor
 A's Copy constructor
 B's constructor

Конструктор класса B теперь использует список инициализатора для инициализации его члена 'a'. Когда используется список инициализатора, член 'a' класса B инициализируется непосредственно из параметра. Таким образом, вызов конструктора А сокращается.
В общем случае рекомендуется использовать Initializer List для инициализации всех членов класса, поскольку он сохраняет одно дополнительное назначение членов. Смотрите пункт 6 этого поста для более подробной информации.

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

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

Вывод программы C ++ | Набор 13

0.00 (0%) 0 votes