Рубрики

Когда разрушаются статические объекты?

Будьте осторожны с этими двумя людьми
новые друзья и старые враги
— Кабир

Что такое статическое ключевое слово в C ++?
Ключевое слово static может применяться к локальным переменным, функциям, членам класса и объектам в C ++. Статические локальные переменные сохраняют свои значения между вызовом функции и инициализируются только один раз. Статическая функция может быть вызвана напрямую с помощью оператора разрешения области действия, которому предшествует имя класса (см. это , это и это для более подробной информации) C ++ также поддерживает статические объекты.

Что такое статические объекты в C ++?
Объект становится статическим, когда в его объявлении используется ключевое слово static. Смотрите следующие два утверждения, например, в C ++.

Test t;             // Stack based object
static Test t1;     // Static object 

Первый оператор, когда выполняется, создает объект в стеке, означает, что память размещена в стеке. Объекты на основе стека также называются автоматическими объектами или локальными объектами. Статический объект инициализируется только один раз и действует до завершения программы. Локальный объект создается каждый раз, когда его объявление встречается при выполнении программы.

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

#include <iostream>

class Test 

{

public:

    Test()

    {

        std::cout << "Constructor is executed\n";

    }

    ~Test()

    {

        std::cout << "Destructor is executed\n";

    }

};

void myfunc()

{

    static Test obj;

} // Объект obj все еще не уничтожен, потому что он статический

  

int main()

{

    std::cout << "main() starts\n";

    myfunc();    // Деструктор здесь не будет вызываться

    std::cout << "main() terminates\n";

    return 0;

}

Выход:

main() starts
Constructor is executed
main() terminates
Destructor is executed 

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

Что происходит, когда мы удаляем статическое в вышеуказанной программе?
В качестве эксперимента, если мы удалим ключевое слово static из глобальной функции myfunc (), мы получим вывод, как показано ниже:

main() starts
Constructor is called
Destructor is called
main() terminates

Это потому, что объект теперь является объектом, основанным на стеке, и он уничтожается, когда выходит из области видимости и вызывается его деструктор.

Как насчет глобальных статических объектов?
Следующая программа демонстрирует использование глобального статического объекта.

#include <iostream>

class Test

{

public:

    int a;

    Test()

    {

        a = 10;

        std::cout << "Constructor is executed\n";

    }

    ~Test()

    {

        std::cout << "Destructor is executed\n";

    }

};

static Test obj;

int main()

{

    std::cout << "main() starts\n";

    std::cout << obj.a;

    std::cout << "\nmain() terminates\n";

    return 0;

}

Выход:

Constructor is executed
main() starts
10
main() terminates
Destructor is executed

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

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

Когда разрушаются статические объекты?

0.00 (0%) 0 votes