Рубрики

Игра с деструкторами в C ++

Предсказать вывод приведенного ниже фрагмента кода.

#include <iostream>

using namespace std;

  

int i;

  

class A

{

public:

    ~A()

    {

        i=10;

    }

};

  

int foo()

{

    i=3;

    A ob;

    return i;

}

  

int main()

{

    cout << "i = " << foo() << endl;

    return 0;

}

Выход вышеуказанной программы: «i = 3».
Почему на выходе i = 3, а не 10?
При возвращении из функции деструктор является последним методом, который будет выполнен. Деструктор для объекта «ob» вызывается после того, как значение i скопировано в возвращаемое значение функции. Таким образом, прежде чем деструктор сможет изменить значение i на 10, будет скопировано текущее значение i и, следовательно, вывод будет i = 3.

Как заставить программу вывести «i = 10»?
Ниже приведены два способа возврата обновленного значения:

1) Возврат по ссылке:
Поскольку ссылка дает l-значение переменной, с помощью return by reference программа выведет «i = 10».

#include <iostream>

using namespace std;

  

int i;

  

class A

{

public:

    ~A()

    {

        i = 10;

    }

};

  

int& foo()

{

    i = 3;

    A ob;

    return i;

}

  

int main()

{

    cout << "i = " << foo() << endl;

    return 0;

}

Функция foo () возвращает l-значение переменной i. Таким образом, адрес i будет скопирован в возвращаемое значение. Поскольку ссылки автоматически разыменовываются. Будет выведено «i = 10».

2. Создайте объект ob в области видимости блока

#include <iostream>

using namespace std;

  

int i;

  

class A

{

public:

    ~A()

    {

        i = 10;

    }

};

  

int foo()

{

    i = 3;

    {

        A ob;

    }

    return i;

}

  

int main()

{

    cout << "i = " << foo() << endl;

    return 0;

}

Так как объект ob создается в области видимости блока, деструктор объекта будет вызываться после окончания блока, тем самым изменяя значение i на 10. Наконец, 10 будет скопировано в возвращаемое значение.

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

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

Игра с деструкторами в C ++

0.00 (0%) 0 votes