Skip to main content

Destructor

Similar to constructor, a class has another special member function called destructor. Destructor cleans up the object.  

When an object goes out of scope, the destructor is automatically called. Destructor is also called when the pointer to the object is released using delete operator.

Destructor has a same name as class and is preceded by tilde (~) symbol. 

Class A has a destructor ~A()
 
Destructor should be used to clean up the object -  release memory and other resources, close files, stop threads etc.

#include <iostream>
using namespace std; 
class Arr
{
 int *elements;
 int len;
public:
 Arr(int len=5);
 ~Arr();//destructor
 int & operator[](int index);
};
Arr::Arr(int len)
{
 elements = new int[len];
}
Arr::~Arr()
{
 delete []elements;
}
int & Arr::operator[](int index)
{
 return elements[index];
} 
int main()
{
 Arr obj(10);
 for(int i=0;i<10;i++)
 obj[i] = i*i; 
} 
 

In the above code, you see the destructor of class Arr, which  releases the memory  allocated by constructor. The object obj is destroyed when main function terminates, and its destructor is called which releases memory.

Destructor takes no parameters. So destructor can not be overloaded.

If there is no user defined destructor, then compiler provides a trivial destructor.

The example shown above uses dynamic memory and hence needs user defined destructor to release memory.

Order of destructor call


Destructor of an object is called when the object is being destroyed - that is when the object goes out of scope.
  1. For global objects, destructor is called at the end of the program.
  2. For local objects, it is called when the block exits.
  3. For parameters and return values, it is called when the function exits.
  4. For dynamically created objects, destructor is called when delete operator is used.
Also note that the order of destructors is the opposite of order of constructors. Which means that the object created last, is destroyed first.

The program below shows the order of destructors.

class A
{
 int num;
public:
 A(int n):num(n){cout<<"constructor"<<n<<endl;}
 ~A()
 {
 cout<<"Destructor";
 }
};
int main()
{
 A obj1(10); 
 if(10>5)
 {
 A obj3(15);
 }
 A obj2(12);
}

The output of the program above will be
constructor10
constructor15
Destructor15
constructor12
Destructor12
Destructor10

Note :
  • Compiler provides the following 4 functions automatically for a class
    1. Default constructor - if the class has no other constructors
    2. Copy Constructor
    3. Destructor
    4. Assignment operator
  • Destructor should be public. If not, objects of class can not be destroyed.
You will find all these notes, quiz and complete programs in Simplified C++ app by Hegdeapps 

Comments

Popular posts from this blog

Ten questions in C/C++

Let us see some questions in C and C++ Write printf statement in C to print - I got 98% in Maths Can you execute a function before main() in C? If yes, how is it done? Can you write a program to find if a number is even without using modulo operator? How do you define a data member which is common to all objects of a class in C++? Can we have a single constructor for a class, but still create objects from the class passing zero/one and two parameters? What problems might occur if a class has no default constructor? Is the following statement correct? fprintf(stdout,"Hello world");   Why do we use the following statement in C++ program? using namespace std;  Can you write a single statement to check if the number is a power of 2?  What does the following statement mean in C/C++?4 if(a) b++;    So we have 10 questions. How many of these can you answer?   Do you need more questions in C and C++?    You can find t...

It is a constant

In good old days, C programmers would use preprocessor directive to define constants. e.g. #define s 10 But we know now that, as compiler never gets to see these, preprocessor statements are error prone. Hence we have const s. A constant - defined with keyword const promises that this entity is never going to change. And if we accidentally modify a const, compiler throws an error. Let us look at an example. #include<iostream> using namespace std; int main () { int a = 10 ; const int b = 12 ; a ++ ; b = 18 ; } When we compile this program, compiler tells us that default.cpp: In function ‘int main()’: default.cpp:8:7: error: assignment of read-only variable ‘b’      b = 18; So it is catching the error that we are trying to modify a const. Whenever a local variable or parameter need not be modified, declare it as a const.  Yes, we can make even parameters as constant. We can make objects constant or even me...

Abstract class

 If we can not create any objects of a class, then it is called an abstract class. A class is made abstract by adding at least one pure virtual function to it. Pure virtual function A function is said to be a pure virtual function , if it has no definition but has only declaration. Pure virtual function is defined with the keyword virtual and followed by return type, function name and "=0". class Shape { public: virtual void printarea() =0 ; }; int main () { Shape obj1; //error } Here printarea() function of Shape class is a pure virtual function as it has no body. To make a function as pure virtual function, you should use =0 at the end of virtual function declaration Abstract class When a class has at least one pure virtual function, it is incomplete and no objects can be created from that class. Such a class is called an abstract class . In the earlier example class Shape is an abstract class, and objects can not be created from t...