×

Destructor

Let’s discover the C++ destructor, virtual and pure virtual destructors, and when destructors are invoked and their rules in this lesson.

Destructors :

A member function that destroys an object is known as a destructor. Destructors acts in the reverse direction as of constructors but are specified similarly to constructors; they destroy class objects. It can be defined only one time in a class, that too with the same name as that of the class. It is called by itself, much like constructors. It however, uses a tilde symbol (~) as a prefix.

Syntax :

~className{


    // Content code
};

Destructors in C++ cannot have arguments and modifiers can't be used on destructors too.

Features of a Destructor :

The major characteristics of a destructor are as follows :

  • The destructor function is called itself on the destruction of the object.
  • It's not feasible to define a destructor as static or const.
  • No parameters are present for the destructor.
  • It does not have a void return type.
  • A member of the association can’t be an element of a class that contains a Destructor.
  • The declaration of a destructor is always required to take place in the public section of that class.
  • The location of destructor is unreachable by the programmer.

When is the destructor invoked?

When an object is no longer in scope, a destructor function is executed automatically:

  1. When a function is completed.
  2. At the conclusion of the program.
  3. When a scope containing local variables ({}-parenthesis) expires.
  4. When you use the delete operator.

What makes destructors distinct from regular member functions?

In the following respects, a destructor differs from regular functions:

  • The name of the destructor is the same as the class, but it is prefixed by a tilde (~).
  • Destructors are known for not taking in any kind of arguments and they also do not return anything itself.

Rules to define a Destructor :

  1. The name must start with a tilde symbol (~) and match the class name.
  2. A class cannot have more than one destructor.
  3. Unlike constructors, destructors do not accept any parameters.
  4. They, like constructors, do not have a return type.
  5. If you don't specify a destructor inside a class, the compiler creates one for you and places it in your code.

Example :

#include <iostream>
using namespace std;
class XYZ
{
    public:
        XYZ () //defining the constructor
       {
 	    cout << "This is inside constructor" << endl;
       }
       ~XYZ() //destructor defining the destructor
       {
             cout << "This is inside destructor" << endl;
       }
};
int main()
{
     XYZ obj1; //calling the constructor
     cout << "main function terminated." << endl;
     return 0;
}

Output:

This is inside constructor
main function terminated.
This is inside destructor

Explanation :

Firstly, class XYZ was created which further helped to define XYZ() constructor and ~XYZ() destructor. When the constructor is invoked, "This is inside constructor" is written, followed by "main function terminated.”, but the object obj1 that was defined previously goes out of scope, and the ~XYZ() destructor is called to de-allocate the memory occupied by obj1.

Example-2 :

#include<iostream>
using namespace std;
 
class exmpl
{
    public:
        int x=50;
         
        exmpl() //constructor is created
        {
            cout<<"It is the Constructor of exmpl !"<<endl;
        }
         
        ~exmpl() //destructor is defined
        {
            cout<<"It is the Destructor of exmpl !"<<endl;
        }
         
        void print_exmpl() // void function
        {
            cout<<"exmpl is printed"<<endl;
        }
};
 
int main()
{
    exmpl exmpl_obj; // created the example object for the class exmpl
    cout<<exmpl_obj.x<<endl;
    exmpl_obj.print_exmpl(); //calling the function
    return 0;
}

Output :

It is the Constructor of exmpl !
50
exmpl is printed
It is the Destructor of exmpl !

Explanation :

We've set up a variable called a=50 and a method called print_exmpl() inside the exmpl class. We've also defined the exmpl() and ~exmpl() constructors and destructors, respectively .

We constructed an object exmpl_obj that corresponds to the exmpl class above within the main() method. As a result, the constructor exmpl() is requested.

Then we did certain activities on it, such as executing the object's print_exmpl() function.

The destructor for the object exmpl_obj is called instantly after the main() function ends. As may be seen from the output above.

C++ Virtual Destructors

Destructing an object of derived class with non-virtual destructor using a reference of base class can cause unclear behavior. A virtual destructor should be provided in the base class to provide a solution to this problem of unclear behavior.

Virtual destructors are allowed in the Base class. These base class Destructors must be made virtual if upcasting is used to ensure that the object is properly destroyed when the application finishes.

Example :

#include<iostream>
using namespace std;
 
class BaseClass 
{
    public:
         
        BaseClass()
        {
            cout<<"Base Constructor!"<<endl;
        }
       virtual ~BaseClass()
        {
            cout<<"Base Destructor!"<<endl;
        }
};
 
class DerivedClass : public BaseClass 
{
    public:
        DerivedClass()
        {
            cout<<"Derived Constructor!"<<endl;
        }
        ~DerivedClass()
        {
            cout<<"Derived Destructor!"<<endl;
        }
};
int main()
{
    BaseClass * obj = new DerivedClass;
    delete obj;
}

Output :

Base Constructor!
Derived Constructor!
Derived Destructor!
Base Destructor!

Explanation :

The virtual keyword is being used in this example before the basic destructor this time.

The result shows that the instruction BaseClass *obj = new DerivedClass , inside the main() method calls the constructors BaseClass() and DerivedClass(), respectively.

Since a virtual destructor is present in this base class while the object obj is being deleted, first the destructor of Derived class is called and then the Base class's destructor.

C++ Pure Virtual Destructors :

When the value of a destructor is set to zero, the virtual destructor is defined in the base class. Pure virtual destructor is also feasible, as is virtual destructor. However, the base class should define this Virtual destructor inside itself.

  • The one and only major difference between a Virtual and a Pure Virtual Destructor is that a Pure Virtual Destructor makes its Base class Abstract, thus the programmer can't construct any object of that class.
  • Pure virtual destructors are not a requirement in the in derived classes.

Example :

#include <iostream>
using namespace std;


// declare a class
class BaseClass {
   public:
    virtual ~BaseClass() = 0; // it is the Pure Virtual Destructor
};
// Defining the Pure Virtual Destructor
BaseClass :: ~BaseClass() {


    cout << "The Pure virtual destructor is being called.\n";
}
class DerivedClass : public BaseClass {
    public:
    ~DerivedClass() {
        cout << "The Derived Destructor is being called." << endl;
    }
}
int main() {


    BaseClass* obj = new DerivedClass;
    delete obj;


    return 0;
}

Output :

The Pure virtual destructor is being called.
The Derived Destructor is being called.

Explanation :

The result shows that the instruction BaseClass *obj = new DerivedClass , inside the main() method calls the constructors BaseClass() and DerivedClass(), respectively.

Because a pure virtual destructor is present inside the base class when removing object obj, the Derived class's pure virtual destructor is called first, followed by the Base class's derived destructor. Since it is a pure virtual destructor, thus it is not required in the derived class.


Related Topics

C++ Deque

Definition: Deque or the Doubly ended queue is a data structure or operation performed under queue where insertion and deletion are allowed at both ends. A deque is an ordered collection of...

5 minutes read.

Differences Between C Structures and C++ Structures

The below table clearly describes the differences between C and C++ programming languages Structures concepts where the core principle concepts like static members, data handling, pointers, access modifiers, the importance...

3 minutes read.

Constructor Overloading

The program contains more than one constructor in a class with the same name, and different types of arguments are called constructor overloading. Calling of constructor depends on the number and types...

2 minutes read.

C++ Static

What is the Static keyword? In C++, the keyword static is used to give an element some particular properties. Static elements are only given storage in the static storage region once...

4 minutes read.

How to initialize a dynamic array in C++

Regular arrays or static arrays have a predetermined size or fixed size. Change in the size of regular arrays is not possible. The memory size for static arrays determines at compile...

4 minutes read.

Difference between OOP and POP in C++

Object-Oriented Programming (OOP) Prioritizes data over methods (functions) and treats data as an essential component of program development.  OOP prohibits the free flow of data throughout the system. Tighter ties to data manipulation...

4 minutes read.

Containership in C++

In C++, it is possible to create an object in one class into another class, and that object is a member of another class. This relationship is known as a...

4 minutes read.

Multiset in C++

Introduction Multisets are part of the C++ STL, or Standard Template Library. In C++, a multiset is a set of associative containers that hold ordered items. Items in a multiset can...

10 minutes read.

Difference between "int main( ) and int main(void)" in C/C++

int main( ) function In the C/C++ programming language, int main() indicates a function that returns an integer at the end of the program execution. In general, a value of '0' indicates...

3 minutes read.

C++ Program For FCFS (First Come First Serve)

The most basic scheduling technique is FCFS, often known as "FIFO (First In, First Out)". In this procedure, the first one is utilized and executed first, while the second one...

4 minutes read.

Functions in C++ with Types and Examples

A function is a collection of statements that work together to complete a certain goal. It could consist of statements that execute repetitive operations or statements that conduct specialized jobs...

10 minutes read.

C++ Structs

We frequently encounter scenarios in which we must store a bunch of data, whether of comparable or dissimilar data kinds. Arrays are used to hold a group of data of...

6 minutes read.

C++ Mutable keyword

C++ mutable keyword Mutable class storage specifier in C++ Storage class specifiers in C are auto, register, static, and external. Typedef is also considered as a specifier of the storage...

4 minutes read.

Array of Object in C++

What is an Array? In C++, an array is a group of related data types, such as int, char, float, double, etc., that are easily accessed by index value alone and...

12 minutes read.

Program to arrange an array in alternate positive and negative numbers

Let’s say, there is given an array arr, arrange the array in such a way that every positive number is followed by a negative number. If there are extra positive...

4 minutes read.

C++ Friend Functions

In C++, friends are special functions that are not a part of a class yet have access to its private and protected members. The friend keyword is used to declare...

4 minutes read.

Difference between exit() and _Exit() in C++

Before understanding the difference between the exit() and _Exit(), one must know about exit() and _Exit() functions. The exit() function in C/C++ The exit() method in the C language kills the calling...

3 minutes read.

Reverse function in C++

The function std::reverse() is included in the standard template library of C++. It takes in a beginning and ending iterator, reversing the order. To use the reverse statement, we need...

2 minutes read.

C++ Program to find largest subarray with 0 sum

Write a program to find the largest subarray that has a sum zero. The array contains positive and negative numbers. Print the length of the max subarray whose sum turns...

4 minutes read.

Unary Operators in C++

Unary operators in C++ Unary operator: is operations that function to produce a new value on a single operand. a) unary minus: A minus operator modifies the argument's symbol. A positive number...

3 minutes read.