Basic Concepts
Basic Concepts
Variables in C++
Operators in C++
Decision Making
Loop types
Storage Classes
Functions
OOPS Concepts
Inline Functions
Function Overloading
Namespace
Static Keyword
Const Keyword
Refrences
Copy Constructor
Pointer to Members
Advanced Topics
Types of Inheritance
Upcasting
Function Overriding
Virtual Functions
Virtual Destructors
Operator Overloading
C++ is an intermediate level language, as it comprises a confirmation of both high level and low
level language features. C++ is a statically typed, free form, multiparadigm, compiled general-
purpose language.
C++ is an Object Oriented Programming language but is not purely Object Oriented.
Its features like Friend and Virtual , violate some of the very important OOPS features,
rendering this language unworthy of being called completely Object Oriented. Its a middle level
language.
2. All the OOPS features in C++ like Abstraction, Encapsulation, Inheritance etc makes it more
3. C++ supports and allows user defined operators (i.e Operator Overloading) and function
5. The Concept of Virtual functions and also Constructors and Destructors for Objects.
6. Inline Functions in C++ instead of Macros in C language. Inline functions make complete
7. Variables can be declared anywhere in the program in C++, but must be declared before
Objects are instances of classes and are used to interact amongst each other to create
applications. Instance means, the object of class on which we are currently working. C++ can be
said to be as C language with classes. In C++ everything revolves around object of class, which
have their methods & data members.
C++ can be said to be as C language with classes. In C++ everything revolves around object of
class, which have their methods & data members.
For Example : We consider human body as a class, we do have multiple objects of this class,
with variable as color, hair etc. and methods as walking, speaking etc.
Now, let us discuss some of the main features of object oriented programming which you will be
using in C++.
1. Objects
2. Classes
3. Abstraction
4. Encapsulation
5. Inheritance
6. Overloading
7. Exception Handling
Objects
Objects are the basic unit of OOP. They are instances of class, which have data members and
uses various member functions to perform tasks.
Class
It is similar to structures in C language. Class can also be defined as user defined data type but it
also contains functions in it. So, class is basically a blueprint for object. It declare & defines what
data variables the object will have and what operations can be performed on the class's object.
Abstraction
Abstraction refers to showing only the essential features of the application and hiding the details.
In C++, classes provide methods to the outside world to access & use the data variables, but the
variables are hidden from direct access.
Encapsulation
It can also be said data binding. Encapsulation is all about binding the data variables and
functions together in class.
Inheritance
Inheritance is a way to reuse once written code again and again. The class which is inherited is
called base calls & the class which inherits is called derived class. So when, a derived class
inherits a base class, the derived class can use all the functions which are defined in base class,
hence making code reusable.
Polymorphism
Polymorphion makes the code more readable. It is a features, which lets is create functions with
same name but different arguments, which will perform differently. That is function with same
name, functioning in different
Overloading
Overloading is a part of polymorphion. Where a function or operator is made & defined many
times, to perform different functions they are said to be overloaded.
Exception Handling
Basics of C++
In this section we will cover the basics of C++, it will include the syntax, variable, operators, loop
types, pointers, references and information about other requirements of a C++ program. You will
come across lot of terms that you have already studied in C language.
Syntax and Structure of C++ program
Here we will discuss one simple and basic C++ program to print "Hello this is C++" and its
structure in parts with details and uses.
int main()
Header files are included at the beginning just like in C program. Here iostream is a header
file which provides us with input & output streams. Header files contained predicated function
libraries, which can be used by users for their ease.
Using namespace std, tells the compiler to use standard namespace. Namespace collects
identifiers used for class, object and variables. NameSpace can be used by two ways in a
program, either by the use of using statement at the beginning, like we did in above mentioned
program or by using name of namespace as prefix before the identifier with scope resolution (::)
operator.
main(), is the function which holds the executing part of program its return type is int .
cout <<, is used to print anything on screen, same as printf in C language. cin and cout are
same as scanf and printf , only difference is that you do not need to mention format
Comments
/*this is
a multiple line
comment */
Using Classes
Classes name must start with capital letter, and they contain data variables and member
functions. This is a mere introduction to classes, we will discuss classes in detail throughout the
C++ tutorial.
class Abc
int main()
This is how class is defined, its object is created and the member functions are used.
Variables can be declared anywhere in the entire program, but must be declared, before they are
used. Hence, we don't need to declare variable at the start of the program.
These are the data types which are predefined and are wired directly into the compiler. eg: int,
char etc.
These are the type, that user creates as a class. In C++ these are classes where as in C it was
implemented by structures.
Example :
For Example :
Here an enumeration of days is defined with variable d. mon will hold value 0, tue will have 1 and
so on. We can also explicitly assign values, like, enum day(mon, tue=7, wed); .
Modifiers
Specifiers modify the meanings of the predefined built-in data types and expand them to a much
larger set. There are four data type modifiers in C++, they are :
1. long
2. short
3. signed
4. unsigned
Below mentioned are some important points you must know about the modifiers,
long and short modify the maximum and minimum values that a data type will hold.
Size hierarchy for floating point numbers is : float < double < long double
long float is not a legal type and there are no short floating point numbers.
Signed types includes both positive and negative numbers and is the default type.
Unsigned, numbers are always without any sign, that is always positive.
Each variable while declaration must be given a datatype, on which the memory assigned to the
variable depends. Following are the basic types of variables,
float and double are also types for variables with large and floating point values
Declaration and Initialization
Variable must be declared before they are used. Usually it is preferred to declare them at the
starting of the program, but in C++ they can be declared in the middle of program too, but must
be done before using them.
Example :
char c;
int i; // declaration
i = 10; // initialization
If a variable is declared and not initialized by default it will hold a garbage value. Also, if a
variable is once declared and if try to declare it again, we will get a compile time error.
int i,j;
i=10;
j=20;
int j=i+j; //compile time error, cannot redeclare a variable in same scope
Scope of Variables
All the variables have their area of functioning, and out of that boundary they don't hold their
value, this boundary is called scope of the variable. For most of the cases its between the curly
braces,in which variable is declared that a variable exists, not outside it. We will study the
storage classes later, but as of now, we can broadly divide variables into two main types,
Global Variables
Local variables
Global variables
Global variables are those, which ar once declared and can be used throughout the lifetime of
the program by any class or any function. They must be declared outside the main() function. If
only declared, they can be assigned different values at different time in program lifetime. But
even if they are declared and initialized at the same time outside the main() function, then also
they can be assigned any value at any point in the program.
include <iostream>
int main()
Local Variables
Local variables are the variables which exist only between the curly braces, in which its declared.
Outside that they are unavailable and leads to compile time error.
Example :
include <iostream>
int main()
int i=10;
{
int n=100; // Local variable declared and initialized
There are also some special keywords, to impart unique characteristics to the variables in the
program. Following two are mostly used, we will discuss them in details later.
Example :
include <iostream>
int main()
Operators in C++
Operators are special type of functions, that takes one or more arguments and produces a new
value. For example : addition (+), substraction (-), multiplication (*) etc, are all operators.
Operators are used to perform various operations on variables and constants.
Types of operators
1. Assignment Operator
2. Mathematical Operators
3. Relational Operators
4. Logical Operators
5. Bitwise Operators
6. Shift Operators
7. Unary Operators
8. Ternary Operator
9. Comma Operator
Assignment Operator ( = )
Operates '=' is used for assignment, it takes the right-hand side (called rvalue) and copy it into
the left-hand side (called lvalue). Assignment operator is the only operator which can be
overloaded but cannot be inherited.
Mathematical Operators
There are operators used to perform basic mathematical operations. Addition (+) , subtraction
(-) , diversion (/) multiplication (*) and modulus (%) are the basic mathematical operators.
Modulus operator cannot be used with floating-point numbers.
C++ and C also use a shorthand notation to perform an operation and assignment at same
type. Example,
int x=10;
Relational Operators
These operators establish a relationship between operands. The relational operators are : less
than (<) , grater thatn (>) , less than or equal to (<=), greater than equal to (>=), equivalent (==)
and not equivalent (!=).
You must notice that assignment operator is (=) and there is a relational operator, for equivalent
(==). These two are different from each other, the assignment operator assigns the value to any
variable, whereas equivalent operator is used to compare values, like in if-else
conditions, Example
Logical Operators
The logical operators are AND (&&) and OR (||). They are used to combine two different
expressions together.
If two statement are connected using AND operator, the validity of both statements will be
considered, but if they are connected using OR operator, then either one of them must be valid.
These operators are mostly used in loops (especially while loop) and in Decision making.
Bitwise Operators
There are used to change individual bits into a number. They work with only integral data types
like char , int and long and not with floating point values.
Bitwise OR operator |
Shift Operators
Shift Operators are used to shift Bits of any variable. It is of three types,
Unary Operators
These are the operators which work on only one operand. There are many unary operators, but
increment ++ and decrement -- operators are most used.
Other Unary Operators : address of & , dereference * , new and delete, bitwise not ~ , logical
not ! , unary minus - and unary plus + .
Ternary Operator
The ternary if-else ? : is an operator which has three operands.
int a = 10;
This is used to separate variable names and to separate expressions. In case of expressions, the
value of last expression is produced and used.
Example :
sizeOf operator can be used with and without parentheses. If you apply it to a variable you can
use it without parentheses.
int x = 2;
int i = sizeOf x;
typedef Operator
typedef is a keyword used in C language to assign alternative names to existing types. Its mostly
used with user defined data types, when names of data types get slightly complicated. Following
is the general syntax for using typedef,
The above statement define a term ulong for an unsigned long type. Now this ulong identifier
can be used to define unsigned long type variables.
ulong i, j ;
typedef and Pointers
typedef can be used to give an alias name to pointers also. Here we have a case in which use of
typedef is beneficial during pointer declaration.
int* x, y ;
By this declaration statement, we are actually declaring x as a pointer of type int, whereas y will
be declared as a plain integer.
IntPtr x, y, z;
But if we use typedef like in above example, we can declare any number of pointers in a single
statement.
if statement
switch statement
goto statement
1. Simple if statement
2. If....else statement
3. Nested if....else statement
4. else if statement
Simple if statement
if( expression )
statement-inside;
statement-outside;
If the expression is true, then 'statement-inside' it will be executed, otherwise 'statement-inside' is
skipped and only 'statement-outside' is executed.
Example :
#include< iostream.h>
int main( )
int x,y;
x=15;
y=13;
if (x > y )
if...else statement
if( expression )
{
statement-block1;
else
statement-block2;
Example :
void main( )
int x,y;
x=15;
y=18;
if (x > y )
else
if( expression )
{
if( expression1 )
statement-block1;
else
statement-block 2;
else
statement-block 3;
Example :
void main( )
int a,b,c;
clrscr();
if(a > b)
if( a > c)
else
{
cout << "c is greatest";
else
if( b> c)
else
printf("c is greatest");
getch();
else-if ladder
if(expression 1)
statement-block1;
else if(expression 2)
statement-block2;
else if(expression 3 )
statement-block3;
}
else
default-statement;
The expression is tested from the top(of the ladder) downwards. As soon as the true condition is
found, the statement associated with it is executed.
Example :
void main( )
int a;
cin >> a;
else if(a%5==0)
else
getch();
}
Points to Remember
1. In if statement, a single statement can be included without enclosing it into curly braces { }
2. int a = 5;
3. if(a > 4)
No curly braces are required in the above case, but if we have more than one statement
5. == must be used for comparison in the expression of if condition, if you use = the
expression will always return true, because it performs assignment not comparison.
Looping in C++
In any programming language, loops are used to execute a set of statements repeatedly until a
particular condition is satisfied.
How it works
execution of loop body, condition is checked, and if it is found to be true the loop body is
executed again. When condition check comes out to be false, the loop body will not be executed.
1. while loop
2. for loop
3. do-while loop
while loop
variable initialization ;
while (condition)
statements ;
for loop
for loop is used to execute a set of statement repeatedly until a particular condition is satisfied.
we can say it an open ended loop. General format is,
statement-block;
In for loop we have exactly two semicolons, one after initialization and second after condition. In
this loop we can have more than one initialization or increment/decrement, separated using
comma operator. for loop can have only one condition.
We can also have nested for loop, i.e one for loop inside another for loop. Basic syntax is,
statement ;
}
do while loop
In some situations it is necessary to execute body of the loop before testing the condition. Such
situations can be handled with the help of do-while loop. do statement evaluates the body of the
loop first and at the end, the condition is checked using while statement. General format of do-
while loop is,
do
....
.....
while(condition)
Sometimes, while executing a loop, it becomes necessary to skip a part of the loop or to leave
the loop as soon as certain condition becocmes true, that is jump out of loop. C language allows
jumping from one statement to another within a loop as well as jumping out of the loop.
1) break statement
When break statement is encountered inside a loop, the loop is immediately exited and the
program continues with the statement immediately following the loop.
2) continue statement
It causes the control to go directly to the test-condition and then continue the loop process. On
encountering continue, cursor leave the current cycle of loop, and starts with the next cycle.
1. Global variables
2. Local variables
3. Register variables
4. Static variables
5. Extern variables
Global Variables
These are defined at the starting , before all function bodies and are available throughout the
program.
void func();
int main()
.....
Local variables
They are defined and are available within a particular scope. They are also called Automatic
variablebecause they come into being when scope is entered and automatically go away when
the scope ends.
The keyword auto is used, but by default all local variables are auto, so we don't have to
explicitly add keyword auto before variable dedaration. Default value of such variable is garbage.
Register variables
This is also a type of local variable. This keyword is used to tell the compiler to make access to
this variable as fast as possible. Variables are stored in registers to increase the access speed.
But you can never use or compute address of register variable and also , a register variable
can be declared only within a block, that means, you cannot have global or static register
variables.
Static Variables
Static variables are the variables which are initialized & allocated storage only once at the
beginning of program execution, no matter how many times they are used and called in the
program. A static variable retains its value until the end of program.
void fun()
i++;
cout << i;
int main()
fun(); // Output = 11
fun(); // Output = 12
fun(); // Output = 13
As, i is static, hence it will retain its value through function calls, and is initialized only once at
the beginning.
Static specifiers are also used in classes, but that we will learn later.
Extern Variables
This keyword is used to access variable in a file which is declared & defined in some other file,
that is the existence of a global variable in one file is declared using extern keyword in another
file.
Functions in C++
Functions are used to provide modularity to a program. Creating an application using function
makes it easier to understand, edit, check errors etc.
Syntax of Function
return-type function-name (parameters)
// function-body
return-type : suggests what the function will return. It can be int, char, some pointer or even
a class object. There can be functions which does not return anything, they are mentioned
with void.
Function Name : is the name of the function, using the function name it is called.
Parameters : are variables to hold values of arguments passed while function is called. A
{
int z;
z = x + y;
cout << z;
}
int main()
{
int a = 10;
int b = 20;
}
Here, a and b are sent as arguments, and x and y are parameters which will hold values of a
Function declaration, is done to tell the compiler about the existence of the function. Function's
return type, its name & parameter list is mentioned. Function body is written in its definition. Lets
understand this with help of an example.
int main()
int a = 10;
int b = 20;
cout << c;
{
return (X + y);
Here, initially the function is declared, without body. Then inside main() function it is called, as
the function returns sumation of two values, hence z is their to store the value of sum. Then, at
last, function is defined, where the body of function is mentioned. We can also, declare & define
the function together, but then it should be done before it is called.
Calling a Function
Functions are called by their names. If the function is without argument, it can be called directly
using its name. But for functions with arguments, we have two ways to call them,
1. Call by Value
2. Call by Reference
Call by Value
In this calling technique we pass the values of arguments which are stored or copied into the
formal parameters of functions. Hence, the original values are unchanged only the parameters
inside function changes.
int main()
int x = 10;
calc(x);
printf("%d", x);
void calc(int x)
x = x + 10 ;
}
Output : 10
In this case the actual variable x is not changed, because we pass argument by value, hence a
copy of x is passed, which is changed, and that copied value is destroyed as the function
ends(goes out of scope). So the variable x inside main() still has a value 10.
But we can change this program to modify the original x, by making the function calc() return a
value, and storing that value in x.
int main()
int x = 10;
x = calc(x);
printf("%d", x);
int calc(int x)
x = x + 10 ;
return x;
Output : 20
Call by Reference
In this we pass the address of the variable as arguments. In this case the formal parameter can
be taken as a reference or a pointer, in both the case they will change the values of the original
variable.
int main()
int x = 10;
*p = *p + 10;
Output : 20
NOTE : If you do not have a prior knowledge of pointers, do study Pointers first.
The variables inside class definition are called as data members and the functions are called
member functions.
For example : Class of birds, all birds can fly and they all have wings and beaks. So here flying
is a behavior and wings and beaks are part of their characteristics. And there are many different
birds in this class with different names but they all posses this behavior and characteristics.
Similarly, class is just a blue print, which declares and defines characteristics and behavior,
namely data members and member functions respectively. And all objects of this class will share
these characteristics and behavior.
1. Class name must start with an uppercase letter. If class name is made of more than one
2. Classes contain, data members and member functions, and the access of these data
members and variable depends on the access specifiers (discussed in next section).
3. Class's member functions can be defined inside the class definition or outside the class
definition.
4. Class in C++ are similar to structures in C, the only difference being, class defaults to private
5. All the features of OOPS, revolve around classes in C++. Inheritance, Encapsulation,
Abstraction etc.
6. Objects of class holds separate copies of data members. We can create as many objects of
a class as we need.
7. Classes do posses more characteristics, like we can create abstract classes, immutable
Objects
Class is mere a blueprint or a template. No storage is assigned when we define a class. Objects
are instances of class, which holds the data variables declared in class and the member
functions work on these class objects.
Each object has different data variables. Objects are initialised using special class functions
calledConstructors. We will study about constructors later.
And whenever the object is out of its scope, another special class member function
called Destructor is called, to release the memory reserved by the object. C++ doesn't have
Automatic Garbage Collector like in JAVA, in C++ Destructor performs this task.
class Abc
int x;
};
in main()
Access specifiers in C++ class defines the access control rules. C++ has 3 new keywords
introduced, namely,
1. public
2. private
3. protected
These access specifiers are used to set boundaries for availability of members of class be it data
members or member functions
Access specifiers in the program, are followed by a colon. You can use either one, two or all 3
specifiers in the same class to set different boundaries for different class members. They change
the boundary for all the declarations that follow them.
Public
Public, means all the class members declared under public will be available to everyone. The
data members and member functions declared public can be accessed by other classes too.
Hence there are chances that they might change them. So the key members must not be
declared public.
class PublicAccess
Private
Private keyword, means that no one can access the class members declared private outside that
class. If someone tries to access the private member, they will get a compile time error. By
default class variables and member functions are private.
class PrivateAccess
Protected
Protected, is the last access specifier, and it is similar to private, it makes class member
inaccessible outside the class. But they can be accessed by any subclass of that class. (If class
A is inherited by class B, then class B is subclass of class A. We will learn this later.)
class ProtectedAccess
class ClassName
Access specifier:
Data members;
Member Functions(){}
};
Here is an example, we have made a simple class named Student with appropriate members,
class Student
public:
int rollno;
string name;
};
So its clear from the syntax and example, class definition starts with the keyword "class" followed
by the class name. Then inside the curly braces comes the class body, that is data members and
member functions, whose access is bounded by access specifier. A class definition ends with a
semicolon, or with a list of object declarations.
Example :
class Student
{
public:
int rollno;
string name;
}A,B;
Here A and B are the objects of class Student, declared with the class definition. We can also
declare objects separately, like we declare variable of primitive data types. In this case the data
type is the class name, and variable is the object.
int main()
Student A;
Student B;
If, the data member is defined as private or protected, then we cannot access the data variables
directly. Then we will have to create special public member functions to access, use or initialize
the private and protected data members. These member functions are also
called Accessors and Mutator methods or getter andsetter functions.
Following is an example to show you how to initialize and use the public data members using the
dot (.) operator and the respective object of class.
class Student
public:
int rollno;
string name;
};
int main()
Student A;
Student B;
A.rollno=1;
A.name="Adam";
B.rollno=2;
B.name="Bella";
To access, use and initialize the private data member you need to create getter and setter
functions, to get and set the value of the data member.
The setter function will set the value passed as argument to the private data member, and the
getter function will return the value of the private data member to be used. Both getter and setter
function must be defined public.
Example :
class Student
int rollno;
public: // public accessor and mutator functions
int getRollno()
return rollno;
void setRollno(int i)
rollno=i;
};
int main()
Student A;
So this is how we access and use the private data members of any class using the getter and
setter methods. We will discuss this in more details later.
Protected data members, can be accessed directly using dot (.) operator inside the subclass of
the current class, for non-subclass we will have to follow the steps same as to access private
data member.
Member Functions in Classes
Member functions are the functions, which have their declaration inside the class definition and
works on the data members of the class. The definition of member functions can be inside or
outside the definition of class.
If the member function is defined inside the class definition it can be defined directly, but if its
defined outside the class, then we have to use the scope resolution :: operator along with class
name alng with function name.
Example :
class Cube
public:
int side;
};
If we define the function inside class then we don't not need to declare it first, we can directly
define the function.
class Cube
public:
int side;
int getVolume()
};
But if we plan to define the member function outside the class definition then we must declare the
function inside class definition and then define it outside.
class Cube
{
public:
int side;
int getVolume();
return side*side*side;
The maine function for both the function definition will be same. Inside main() we will create
object of class, and will call the member function using dot . operator.
int main()
Cube C1;
Similarly we can define the getter and setter functions to access private data members, inside or
outside the class definition.
1. Simple functions
2. Static functions
3. Const functions
4. Inline functions
5. Friend functions
Simple Member functions
These are the basic member function, which dont have any special keyword like static etc as
prefix. All the general member functions, which are of below given form, are termed as simple
and basic member functions.
return_type functionName(parameter_list)
function body;
Static is something that holds its position. Static is a keyword which can be used with data
members as well as the member functions. We will discuss this in details later. As of now we will
discuss its usage with member functions only.
A function is made static by using static keyword with function name. These functions work for
the class as whole rather than for a particular object of a class.
It can be called using the object and the direct member access . operator. But, its more typical
to call a static member function by itself, using class name and scope resolution :: operator.
Example :
class X
public:
};
int main()
}
These functions cannot access ordinary data members and member functions, but only static
data members and static member functions.
It doesn't have any "this" keyword which is the reason it cannot access ordinary members. We
will study about "this" keyword later.
We will study Const keyword in detail later, but as an introduction, Const keyword makes
variables constant, that means once defined, there values can't be changed.
When used with member function, such member functions can never modify the object or its
related data members.
Inline functions
All the member functions defined inside the class definition are by default declared as Inline. We
will study Inline Functions in details in the next topic.
Friend functions
Friend functions are actually not class member function. Friend functions are made to
give private access to non-class functions. You can declare a global function as friend, or a
member function of other class as friend.
Example :
class WithFriend
int i;
public:
};
void fun()
WithFriend wf;
int main()
Hence, friend functions can access private data members by creating object of the class.
Similarly we can also make function of other class as friend, or we can also make an entire class
as friend class.
class Other
void fun();
};
class WithFriend
private:
int i;
public:
When we make a class as friend, all its member functions automatically become friend functions.
Friend Functions is a reason, why C++ is not called as a pure Object Oriented language.
Because it violates the concept of Encapsulation.
You must remember Preprocessors from C language. Inline functions in C++ do the same thing
what Macros do in C. Preprocessors were not used in C++ because they had some drawbacks.
Drawbacks of Macro
In Macro, we define certain variable with its value at the beginning of the program, and
everywhere inside the program where we use that variable, its replaced by its value on
Compilation.
Here we have defined a Macro with name G(y), which is to be replaced by its value, that is (y+1)
during compilation. But, what actually happens when we call G(y),
You must be thinking why this happened, this happened because of the spacing in Macro
definition. Hence big functions with several expressions can never be used with macro, so Inline
functions were introduced in C++.
2) Complex Argument Problem
In some cases such Macro expressions work fine for certain arguments but when we use
complex arguments problems start arising.
Here precedence of operators will lead to problem, because precedence of & is lower than that
of > , so the macro evaluation will surprise you. This problem can be solved though using
With Macros, in C++ you can never access private variables, so you will have to make those
members public, which will expose the implementation.
class Y
int x;
public :
Inline Functions
Inline functions are actual functions, which are copied everywhere during compilation, like
preprocessor macro, so the overhead of function calling is reduced. All the functions defined
inside class definition are by default inline, but you can also make any non-class function inline
by using keyword inline with them.
For an inline function, declaration and definition must be done together. For example,
return a++;
1. We must keep inline functions small, small inline functions have better efficiency.
2. Inline functions do increase efficiency, but we should not make all the functions inline.
Because if we make large functions inline, it may lead to code bloat, and might affect the
speed too.
3. Hence, it is adviced to define large functions outside the class definition using scope
resolution :: operator, because if we define such functions inside class definition, then they
4. Inline functions are kept in the Symbol Table by the compiler, and all the call for such
Access Functions
We have already studied this in topic Accessing Private Data variables inside class. We use
access functions, which are inline to do so.
class Auto
int i;
public:
int getdata()
return i;
void setdata(int x)
{
i=x;
};
Here getdata() and setdata() are inline functions, and are made to access the private data
members of the class Auto. getdata(), in this case is called Accessor function and setdata() is
a Mutator function.
There can be overlaoded Accessor and Mutator functions too. We will study overloading
functions in next topic.
1. The compiler is unable to perform inlining if the function is too complicated. So we must
avoid big looping conditions inside such functions. In case of inline functions, entire function
body is inserted in place of each call, so if the function is large it will affect speed and
memory badly.
2. Also, if we require address of the function in program, compiler cannot perform inlining on
such functions. Because for providing address to a function, compiler will have to allocate
storage to it. But inline functions doesn't get storage, they are kept in Symbol table.
Forward References
All the inline functions are evaluated by the compiler, at the end of class declaration.
class ForwardReference
int i;
public:
};
int main()
ForwardReference fr;
fr.f();
You must be thinking that this will lead to compile time error,but in this case it will work, because
no inline function in a class is evaluated until the closing braces of class declaration.
Function Overloading
If any class have multiple functions with same names but different parameters then they are said
to be overloaded. Function overloading allows you to use the same name for different functions,
to perform, either same or different functions in the same class.
Function overloading is usually used to enhance the readability of the program. If you have to
perform one single operation but with different number or types of arguments, then you can
simply overload the function.
In this type of function overloading we define two functions with same names but different
number of parameters of the same type. For example, in the below mentioned program we have
made two sum() functions to return sum of two and three integers.
}
int sum(int x, int y, int z)
Here sum() function is overloaded, to have two and three arguments. Which sum() function will
be called, depends on the number of arguments.
int main()
In this type of overloading we define two or more functions with same name and same number of
parameters, but the type of parameter is different. For example in this program, we have two
sum() function, first one gets two integer arguments and second one gets two double arguments.
cout<< x+y;
int main()
{
sum (10,20);
sum(10.5,20.5);
Default Arguments
When we mention a default value for a parameter while declaring the function, it is said to be as
default argument. In this case, even if we make a call to the function without passing any value
for that parameter, the function will take the default value specified.
int main()
sum(10);
sum(10,0);
sum(10,10);
Output : 10 10 20 First two function calls will produce the exact same value.
for the third function call, y will take 10 as value and output will become 20.
By setting default argument, we are also overloading the function. Default arguments also allow
you to use the same function in different situations just like function overloading.
1. Only the last argument must be given default value. You cannot have a default argument
2. If you default an argument, then you will have to default all the subsequent arguments after
that.
3. You can give any value a default value to argument, compatible with its datatype.
Placeholder Arguments
When arguments in a function are declared without any identifier they are called placeholder
arguments.
class A
int x;
public:
A(); //Constructor
};
While defining a contructor you must remeber that the name of constructor will be same as the
name of the class, and contructors never have return type.
Constructors can be defined either inside the class definition or outside class definition using
class name and scope resolution :: operator.
class A
int i;
public:
};
{
i=1;
Types of Constructors
1. Default Constructor
2. Parametrized Constructor
3. Copy COnstructor
Default Constructor
Default constructor is the constructor which doesn't take any argument. It has no parameter.
Syntax :
class_name ()
{ Constructor Definition }
Example :
class Cube
int side;
public:
Cube()
side=10;
};
int main()
Cube c;
cout << c.side;
Output : 10
In this case, as soon as the object is created the constructor is called which initializes its data
members.
A default constructor is so important for initialization of object members, that even if we do not
define a constructor explicitly, the compiler will provide a default constructor implicitly.
class Cube
int side;
};
int main()
Cube c;
Output : 0
In this case, default constructor provided by the compiler will be called which will initialize the
object data members to default value, that will be 0 in this case.
Parameterized Constructor
These are the constructors with parameter. Using this Constructor you can provide different
values to data members of different objects, by passing the appropriate values as argument.
Example :
class Cube
int side;
public:
Cube(int x)
side=x;
};
int main()
Cube c1(10);
Cube c2(20);
Cube c3(30);
OUTPUT : 10 20 30
By using parameterized construcor in above case, we have initialized 3 objects with user defined
values. We can have any number of parameters in a constructor.
Copy Constructor
These are special type of Constructors which takes an object as argument, and is used to copy
values of data members of one object into other object. We will study copy constructors in detail
later.
Constructor Overloading
Just like other member functions, constructors can also be overloaded. Infact when you have
both default and parameterized constructors defined in your class you are having Overloaded
Constructors, one with no parameter and other with parameter.
You can have any number of Constructors in a class that differ in parameter list.
class Student
int rollno;
string name;
public:
Student(int x)
rollno=x;
name="None";
rollno=x ;
name=str ;
};
int main()
Student A(10);
Student B(11,"Ram");
In above case we have defined two constructors with different parameters, hence overloading
the constructors.
One more important thing, if you define any constructor explicitly, then the compiler will not
provide default constructor and you will have to define it yourself.
In the above case if we write Student S; in main(), it will lead to a compile time error, because
we haven't defined default constructor, and compiler will not provide its default constructor
because we have defined other parameterized constructors.
Destructors
Destructor is a special class function which destroys the object as soon as the scope of object
ends. The destructor is called automatically by the compiler when the object goes out of scope.
The syntax for destructor is same as that for the constructor, the class name is used for the
name of destructor, with a tilde ~ sign as prefix to it.
class A
public:
~A();
};
A()
~A()
};
int main()
int x=1
if(x)
In this example we will use default argument to have a single definition for both defualt and
parameterized constructor.
class Dual
int a;
public:
Dual(int x=0)
a=x;
};
int main()
Dual obj1;
Dual obj2(10);
Here, in this program, a single Constructor definition will take care for both these object
initializations. We don't need separate default and parameterized constructors.
Namespace
Namespace is a container for identifiers. It puts the names of its members in a distinct space so
that they don't conflict with the names in other namespaces or global namespace.
Creating a Namespace
namespace MySpace
// Declarations
int main() {}
This will create a namespace called MySpace, inside which we can put our member declarations.
1. The namespace definition must be done at global scope, or nested inside another
namespace.
3. You can use an alias name for your namespace name, for ease of use.
namespace StudyTonightDotCom
void study();
class Learn { };
namespace
class Head { };
class Tail { };
int i,j,k;
int main() { }
6. A namespace definition can be continued and extended over multiple files, they are not
redefined or overriden.
Example :
Header1.h
namespace MySpace
int x;
void f();
Header2.h
#include "Header1.h";
namespace MySpace
int y;
void g();
Using a Namespace
1. Scope Resolution
Any name (identifier) declared in a namespace can be explicitly specified using the namespace's
name and the scope resolution :: operator with the identifier.
namespace MySpace
class A
static int i;
public:
void f();
};
class MySpace::B
int x;
public:
int getdata()
cout << x;
x=0;
using keyword allows you to import an entire namespace into your program with a global scope.
It can be used to import a namespace into another namespace or any program.
Namespace1.h
namespace X
int x;
class Check
int i;
};
Namespace2.h
include "Namespace1.h";
namespace Y
using namespace X;
Check obj;
int y;
We imported the namespace X into namespace Y, hence class Check is available in namespace
Y.
Program.cpp
#include "Namespace2.h";
void test()
using Namespace Y;
Check obj2;
Hence, the using directive makes it a lot easier to use namespace, wherever you want.
When we use using directive, we import all the names in the namespace and they are available
throughout the program, that is they have global scope.
But with using declaration, we import one specific name at a time which is available only inside
the current scope.
NOTE : Name imported with using declaration can override the name imported with using
directive
Namespace.h
namespace X
{
void f() {}
void g() {}
namespace Y
void f() {}
void g() {}
Program.cpp
#include "Namespace.h";
void h()
In using declaration, we never mention the argument list of a function while importing it, hence if
a namespace has overloaded function, it will lead to ambiguity.
Static Keyword
Static is a keyword in C++ used to give special characteristics to an element. Static elements are
allocated storage only once in a program lifetime in static storage area. And they have a scope
till the program lifetime. Static Keyword can be used with following,
Static variables when used inside function are initialized only once, and then they hold there
value even through function calls.
These static variables are stored on static storage area , not in stack.
void counter()
int main(0
for(int i=0;i<5;i++)
counter();
Output : 0 1 2 3 4
void counter()
int count=0;
}
int main(0
for(int i=0;i<5;i++)
counter();
Output : 0 0 0 0 0
If we do not use static keyword, the variable count, is reinitialized everytime when counter()
function is called, and gets destroyed each time when counter() functions ends. But, if we make it
static, once initialized count will have a scope till the end of main() function and it will carry its
value through function calls too.
If you don't initialize a static variable, they are by default initialized to zero.
Static keyword works in the same way for class objects too. Objects declared static are allocated
storage in static storage area, and have scope till the end of program.
Static objects are also initialized usig constructors like other normal objects. Assignment to zero,
on using static keyword is only for primitive datatypes, not for user defined datatypes.
class Abc
int i;
public:
Abc()
i=0;
~Abc()
{
cout << "destructor";
};
void f()
int main()
int x=0;
if(x==0)
f();
You must be thinking, why was destructor not called upon the end of the scope of if condition.
This is because object was static, which has scope till the program lifetime, hence destructor for
this object was called when main() exits.
Static data members of class are those members which are shared by all the objects. Static data
member has a single piece of storage, and is not available as separate copy with each object,
like other non-static data members.
Static member variables (data members) are not initialied using constructor, because these are
not dependent on object initialization.
Also, it must be initialized explicitly, always outside the class. If not initialized, Linker will give
error.
class X
static int i;
public:
X(){};
};
int X::i=1;
int main()
X obj;
Once the definition for static data member is made, user cannot redefine it. Though, arithmetic
operations can be performed on it.
These functions work for the class as whole rather than for a particular object of a class.
It can be called using an object and the direct member access . operator. But, its more typical
to call a static member function by itself, using class name and scope resolution :: operator.
Example :
class X
public:
};
int main()
{
These functions cannot access ordinary data members and member functions, but only static
data members and static member functions.
It doesn't have any "this" keyword which is the reason it cannot access ordinary members. We
will study about "this" keyword later.
Const Keyword
Constant is something that doesn't change. In C and C++ we use the keyword const to make
program elements constant. Const keyword can be used in many context in a C++ program.
Const keyword can be used with:
1. Variables
2. Pointers
6. Objects
1) Constant Variables
If you make any variable as constant, using const keyword, you cannot change its value. Also,
the constant variables must be initialized while declared.
int main
In this program we have made i as constant, hence if we try to change its value, compile time
error is given. Though we can use it for substitution.
2) Pointers with Const
Pointers can be made const too. When we use const with pointers, we can do it in two ways,
either we can apply const to what the pointer is pointing to, or we can make the pointer itself a
const.
Pointer to Const
const int* u;
Here, u is a pointer that points to a const int. We can also write it like,
int const* v;
still it has the same meaning. In this case also, v is a pointer to an int which is const.
Const pointer
To make the pointer const, we have to put the const keyword to the right of the * .
int x = 1;
Here, w is a pointer, which is const, that points to an int. Now we can't change the pointer but
can change the value that it points to.
We can make the return type or arguments of a function as const. Then we cannot change any of
them.
i++; // Error
}
return 1;
1. For built in types, returning a const or non-const, doesn't amke any difference.
return 1;
it main(0
int k = h();
2. For user defined data types, returning const, will prevent its modification.
3. Temporary objects created while program execution are always of const type.
4. If a function has a non-const parameter, it cannot be passed a const argument while making
a call.
void t(int*) { }
This function can have a int* as well as const int* type argument.
These are data variables in class which are made const. They are not initialized during
declaration. Their initialization occur in the constructor.
class Test
const int i;
public:
Test (int x)
i=x;
};
int main()
Test t(10);
Test s(20);
In this program, i is a const data member, in every object its independent copy is present, hence
it is initialized with each object using constructor. Once initialized, it cannot be changed.
When an object is declared or created with const, its data members can never be changed,
during object's lifetime.
Syntax :
Syntax :
int i;
public:
X(int x) // Constructor
{ i=x; }
{ i++; }
int g()
{ i++; }
};
int main()
obj1.f(); // No error
obj2.f(); // No error
obj1.g(); // No error
Output : 10 20
Here, we can see, that const member function never changes data members of class, and it can
be used with both const and non-const object. But a const object can't be used with a member
function which tries to change its data members.
Mutable Keyword
Mutable keyword is used with member variables of class, which we want to change even if the
object is of const type. Hence, mutable data members of a const objects can be modified.
class Z
int i;
mutable int j;
public:
Z()
{i=0; j=0;}
{ i++; // Error
};
int main(0
{
const Z obj;
obj.f();
References in C++
References are like constant pointers that are automatically dereferenced. It is a new name given
to an existing storage. So when you are accessing the reference, you are actually accessing that
storage.
int main()
{ int y=10;
cout << r;
Output : 10
References Pointers
Reference must be initialized when it is created. Pointers can be initialized any time.
Once initialized, we cannot reinitialize a reference. Pointers can be reinitialized any number of time.
References in Funtions
References are generally used for function argument lists and function return values, just like
pointers.
1. When we use reference in argument list, we must keep in mind that any change to the
reference inside the function will cause change to the original argument outside th function.
2. When we return a reference from a function, you should see that whatever the reference is
connected to shouldn't go out of scope when fnction ends. Either make that global or static
{ (*x++);
{ x++;
int& third ()
{ int q;
int& fourth ()
{ static int x;
return x; // SAFE, x is static, hence lives till the end.
int main()
int a=0;
first() takes a pointer as argument and returns a pointer, it will work fine. The returning
pointer points to variable declared outside first(), hence it will be valid even after the first()
ends.
Similarly, second() will also work fine. The returning reference is connected to valid storage,
that is int a in this case.
But in case of third(), we declare a variable q inside the function and try to return a
reference connected to it. But as soon as function third() ends, the local variable q is
To remedify above problem, we make x as static in function fourth(), giving it a lifetime till
main() ends, hence now a reference connected to x will be valid when returned.
Const Reference
Const reference is used in function arguments to prevent the function from changing the
argument.
{ x++; } // ERROR
int main()
int i=10;
g(i);
We cannot change the argument in the function because it is passed as const reference.
Usually call by value is used during funtcion call just to save our object or variable from being
changed or modified, but whenever we pass an argument by value, its new copy is created. If we
pass an object as argument then a copy of that object is created (constructor and destructors
called), which affects efficiency.
Hence, we must use const reference type arguments. When we use, const reference, only an
address is passed on stack, which is used inside the function and the function cannot change our
argument because it is of const type.
So using const reference type argument reduces overhead and also saves our argument from
being changed.
Copy Constructor in C++
Copy Constructor is a type of constructor which is used to create a copy of an already
existing object of a class type. It is usually of the form X (X&), where X is the class name.he
compiler provides a default Copy Constructor to all the classes.
. . . .
As it is used to create an object, hence it is called a constructor. And, it creates a new object,
which is exact copy of the existing copy, hence it is called copy constructor.
Pointers to class members
Just like pointers to normal variables and functions, we can have pointers to class member
functions and member variables.
We can define pointer of class type, which can be used to point to class objects.
class Simple
public:
int a;
};
int main()
Simple obj;
ptr = &obj;
cout << obj.a;
Here you can see that we have declared a pointer of class type which points to class's object.
We can access data members and member functions using pointer name with arrow -> symbol.
to object. But when we have a pointer to data member, we have to dereference that pointer to
get what its pointing to, hence it becomes,
Object.*pointerToMember
ObjectPointer->*pointerToMember
class Data
{
public:
int a;
};
int main()
Data d, *dp;
d.*ptr=10;
d.print();
dp->*ptr=20;
dp->print();
The syntax is very tough, hence they are only used under special circumstances.
Syntax :
class Data
{ public:
};
int main(0
1. You can change the value and behaviour of these pointers on runtime. That means, you can
2. To have pointer to data member and member functions you need to make them public.
3. Overview of Inheritance
Inheritance is the capability of one class to acquire properties and characteristics from another
class. The class whose properties are inherited by other class is called
the Parent or Base or Super class. And, the class which inherits properties of other class is
called Child or Derived or Sub class.
Inheritance makes the code reusable. When we inherit an existing class, all its methods and
fields become available in the new class, hence code is reused.
Purpose of Inheritance
1. Code Reusability
While defining a subclass like this, the super class must be already defined or atleast declared
before the subclass declaration.
Access Mode is used to specify, the mode in which the properties of superclass will be inherited
into subclass, public, privtate or protected.
Example of Inheritance
class Animal
{ public:
int legs = 4;
};
{ public:
int tail = 1;
};
int main()
Dog d;
Output : 4 1
1) Public Inheritance
This is the most used inheritance mode. In this the protected member of super class becomes
protected members of sub class and public becomes public.
2) Private Inheritance
In private mode, the protected and public members of super class become private members of
derived class.
3) Protected Inheritance
In protected mode, the public and protected members of Super class becomes protected
members of Sub class.
Derived Class
1. Single Inheritance
2. Multiple Inheritance
3. Hierarchical Inheritance
4. Multilevel Inheritance
Single Inheritance
In this type of inheritance one derived class inherits from only one base class. It is the most
simplest form of Inheritance.
Multiple Inheritance
In this type of inheritance a single derived class may inherit from two or more than two base
classes.
Hierarchical Inheritance
In this type of inheritance, multiple derived classes inherits from a single base class.
Multilevel Inheritance
In this type of inheritance the derived class inherits from a class, which in turn inherits from some
other class. The Super class for one, is sub class for the other.
Hybrid (Virtual) Inheritance
Points to Remember
1. Whether derived class's default constructor is called or parameterised is called, base class's
constructor.
class Base
{ int x;
public:
};
{ int y;
public:
};
int main()
Base b;
Derived d1;
Derived d2(10);
You will see in the above example that with both the object creation of the Derived class, Base
class's default constructor is called.
Base class Parameterized Constructor in Derived class Constructor
We can explicitly mention to call the Base class's parameterized constructor when Derived
class's parameterized constructor is called.
class Base
{ int x;
public:
Base(int i)
{ x = i;
};
{ int y;
public:
Derived(int j) : Base(j)
{ y = j;
};
int main()
Derived d(10) ;
}
Why is Base class Constructor called inside Derived class ?
Constructors have a special job of initializing the object properly. A Derived class constructor has
access only to its own class members, but a Derived class object also have inherited property of
Base class, and only base class constructor can properly initialize base class members. Hence
all the constructors are called, else object wouldn't be constructed properly.
Its almost the same, all the Base class's constructors are called inside derived class's
constructor, in the same order in which they are inherited.
In this case, first class B constructor will be executed, then class C constructor and then class A
constructor.
Upcasting in C++
Upcasting is using the Super class's reference or pointer to refer to a Sub class's object. Or we
can say that, the act of converting a Sub class's reference or pointer into its Super class's
reference or pointer is called Upcasting.
class Super
{ int x;
public:
{ int y;
};
int main()
Sub obj;
ptr = &obj;
ref=obj;
Constructors and Destructors are never inherited and hence never overrided.
Also, assignment operator = is never inherited. It can be overloaded but can't be inherited
by sub class.
2. If you redefine a static member function in derived class, all the other overloaded functions in
3. Static Member functions can never be virtual. We will study about Virtual in coming topics.
Hybrid Inheritance and Virtual Class
In Multiple Inheritance, the derived class inherits from more than one base class. Hence, in
Multiple Inheritance there are a lot chances of ambiguity.
class A
{ void show(); };
int main()
D obj;
obj.show();
In this case both class B and C inherits function show() from class A. Hence class D has two
inherited copies of function show(). In main() function when we call function show(), then
ambiguity arises, because compiler doesn't know which show() function to call. Hence we
use Virtual keyword while inheriting class.
Now by adding virtual keyword, we tell compiler to call any one out of the two show() funtions.
Hybrid Inheritance and Constructor call
As we all know that whenever a derived class object is instantiated, the base class constructor is
always called. But in case of Hybrid Inheritance, as discussed in above example, if we create an
instance of class D, then following constructors will be called :
before class D's constructor, constructors of its super classes will be called, hence
when constructors of class B and class C are called, they will again make a call to their super
class's constructor.
This will result in multiple calls to the constructor of class A, which is undesirable. As there is a
single instance of virtual base class which is shared by multiple classes that inherit from it, hence
the constructor of the base class is only called once by the constructor of concrete class, which
in our case is class D.
If there is any call for initializing the constructor of class A in class B or class C, while creating
object of class D, all such calls will be skipped.
4. Polymorphism
Polymorphism means having multiple forms of one thing. In inheritance, polymorphism is done,
by method overriding, when both super and sub class have member function with same
declaration bu different definition.
Function Overriding
If we inherit a class into the derived class and provide a definition for one of the base class's
function again inside the derived class, then that function is said to be overridden, and this
mechanism is called Function Overriding
1. Inheritance should be there. Function overriding cannot be done within a class. For this we
2. Function that is redefined must have exactly the same declaration in both base and derived
class, that means same name, same return type and same parameter list.
public:
void show()
};
public:
void show()
In this example, function show() is overridden in the derived class. Now let us study how these
overridden functions are called in main() function.
Connecting the function call to the function body is called Binding. When it is done before the
program is run, its called Early Binding or Static Binding or Compile-time Binding.
class Base
public:
void shaow()
};
public:
void show()
int mian()
{
Base b; //Base class object
d.show();
In the above example, we are calling the overrided function using Base class and Derived class
object. Base class object will call base version of the function and derived class's object will call
the derived version of the function.
But when we use a Base class's pointer or reference to hold Derived class's object, then
Function call Binding gives some unexpected results.
class Base
public:
void shaow()
};
public:
void show()
}
int mian()
b = &d;
In the above example, although, the object is of Derived class, still Base class's method is called.
This happens due to Early Binding.
Compiler on seeing Base class's pointer, set call to Base class's show() function, without
knowing the actual object type.
Virtual Functions
Virtual Function is a function in base class, which is overrided in the derived class, and which
tells the compiler to perform Late Binding on this function.
Virtual Keyword is used to make a member function of the base class Virtual.
Late Binding
In Late Binding function call is resolved at runtime. Hence, now compiler determines the type of
object at runtime, and then binds the function call. Late Binding is also called Dynamic Binding
or Runtime Binding.
public:
void show()
};
public:
void show()
int main()
b = &d;
When we use Base class's pointer to hold Derived class's object, base class pointer or reference
will always call the base version of the function
We can make base class's methods virtual by using virtual keyword while declaring them. Virtual
keyword will lead to Late Binding of that method.
class Base
public:
{
cout << "Base class";
};
public:
void show()
int main()
b = &d;
On using Virtual keyword with Base class's function, Late Binding takes place and the derived
version of function will be called, because base class pointer pointes to Derived class object.
We can call private function of derived class from the base class pointer with the help of virtual
keyword. Compiler checks for access specifier only at compile time. So at run time when late
binding occurs it does not check whether we are calling the private function or public function.
#include
public:
};
class B: public A
private:
};
int main()
A *a;
B b;
a = &b;
a -> show();
To accomplich late binding, Compiler creates VTABLEs, for each class with virtual function. The
address of virtual functions is inserted into these tables. Whenever an object of such class is
created the compiler secretly inserts a pointer called vpointer, pointing to VTABLE for that
object. Hence when function is called, compiler is able to resovle the call by binding the correct
function using the vpointer.
1. Only the Base class Method's declaration needs the Virtual Keyword, not the definition.
2. If a function is declared as virtual in the base class, it will be virtual in all its derived classes.
3. The address of the virtual Function is placed in the VTABLE and the copiler
Abstract Class
Abstract Class is a class which contains atleast one Pure Virtual function in it. Abstract classes
are used to provide an Interface for its sub classes. Classes inheriting an Abstract Class must
provide definition to the pure virtual function, otherwise they will also become abstract class.
1. Abstract class cannot be instantiated, but pointers and refrences of Abstract class type can
be created.
2. Abstract class can have normal functions and variables along with a pure virtual function.
3. Abstract classes are mainly used for Upcasting, so that its derived classes can use its
interface.
4. Classes inheriting an Abstract Class must implement all pure virtual functions, or else they
Pure virtual Functions are virtual functions with no definition. They start with virtual keyword and
ends with = 0 . Here is the syntax for a pure virtual function,
public:
};
public:
void show()
};
int main()
Base *b;
Derived d;
b = &d;
b->show();
In the above example Base class is abstract, with pure virtual show() function, hence we cannot
create object of base class.
When we create a pure virtual function in Abstract class, we reserve a slot for a function in the
VTABLE(studied in last topic), but doesn't put any address in that slot. Hence the VTABLE will be
incomplete.
As the VTABLE for Abstract class is incomplete, hence the compiler will not let the creation of
object for such class and will display an errror message whenever you try to do so.
Pure Virtual functions can be given a small definition in the Abstract class, which you want all
the derived classes to have. Still you cannot create object of Abstract class.
Also, the Pure Virtual function must be defined outside the class definition. If you will define it
inside the class definition, complier will give an error. Inline pure virtual definition is Illegal.
public:
};
public:
void show()
};
int main()
Base *b;
Derived d;
b = &d;
b->show();
Output :
Virtual Destructors
Destructors in the Base class can be Virtual. Whenever Upcasting is done, Destructors of the
Base class must be made virtual for proper destrucstion of the object when the program exits.
Lets first see what happens when we do not have a virtual Base class destructor.
class Base
public:
};
public:
};
int main()
delete b;
In the above example, delete b will only call the Base class destructor, which is undesirable
because, then the object of Derived class remains undestructed, because its destructor is never
called. Which results in memory leak.
Upcasting with Virtual Destructor
Now lets see. what happens when we have Virtual destructor in the base class.
class Base
public:
};
public:
};
int main()
delete b;
Output :
Derived Destructor
Base Destructor
When we have Virtual destructor inside the base class, then first Derived class's destructor is
called and then Base class's destructor is called, which is the desired behaviour.
Pure Virtual Destructors are legal in C++. Also, pure virtual Destructors must be defined,
destructor will make its Base class Abstract, hence you cannot create object of that class.
class Base
public:
};
public:
};
Operator Overloading
Operator overloading is an important concept in C++. It is a type of polymorphism in which an
operator is overloaded to give user defined meaning to it. Overloaded operator is used to perform
operation on user-defined data type. For example '+' operator can be overloaded to perform
addition on various data types, like for Integer, String(concatenation) etc.
Almost any operator can be overloaded in C++. However there are few operator which can not
be overloaded.Operator that are not overloaded are follows
scope operator - ::
sizeof
member selector - .
ternary operator - ?:
1. Member Function
2. Non-Member Function
3. Friend Function
Operator overloading function can be a member function if the Left operand is an Object of that
class, but if the Left operand is different, then Operator overloading function must be a non-
member function.
Operator overloading function can be made friend function if it needs access to the private and
protected members of class.
Restrictions on Operator Overloading
Following are some restrictions to be kept in mind while implementing operator overloading.
2. Arity (numbers of Operands) cannot be changed. Unary operator remains unary, binary
4. Cannot redefine the meaning of a procedure. You cannot change how integers are added.
Arithmetic operator are most commonly used operator in C++. Almost all arithmetic operator can
be overloaded to perform arithmetic operation on user-defined data type. In the below example
we have overridden the + operator, to add to Time(hh:mm:ss) objects.
#include< conio.h>
class time
int h,m,s;
public:
time()
}
void getTime();
void show()
};
time t;
int a,b;
a=s+t1.s;
t.s=a%60;
b=(a/60)+m+t1.m;
t.m=b%60;
t.h=(b/60)+h+t1.h;
t.h=t.h%12;
return t;
void time::getTime()
cin>>h;
cin>>m;
cin>>s;
void main()
clrscr();
time t1,t2,t3;
t1.getTime();
t2.getTime();
t1.show();
t2.show();
t3.show();
getch();
Function overloading this operator must be a Non-Member function because left operand is
You have seen above that << operator is overloaded with ostream class object cout to print
primitive type value output to the screen. Similarly you can overload << operator in your class to
print user-defined type to screen. For example we will overload << in time class to display time
object using cout .
time t1(3,15,48);
NOTE: When the operator does not modify its operands, the best way to overload the operator is
via friend function.
Example: overloading '<<' Operator to print time object
#include< iostream.h>
#include< conio.h>
class time
int hr,min,sec;
public:
time()
friend ostream& operator << (ostream &out, time &tm); //overloading '<<'
operator
};
out << "Time is " << tm.hr << "hour : " << tm.min << "min : " << tm.sec <<
"sec";
return out;
void main()
time tm(3,15,45);
cout << tm;
Output
defined object.
Example
class time
int hr,min,sec;
public:
time()
};
Assignment operator is used to copy the values from one object to another already existing
object. For example
Copy constructor is a special constructor that initializes a new object from an existing object.