You are on page 1of 56

RAJALAKSHMI INSTITUTE OF

TECHNOLOGY

EC 2202 DATA STRUCTURES AND OBJECT ORIENTED


PROGRAMMING IN C++

LECTURE NOTES

Prepared by,
T.Illakiya, AP/CSE

SYLLABUS
UNIT I
DATA ABSTRACTION & OVERLOADING
Overview of C++ Structures Class Scope and Accessing Class Members Reference
Variables Initialization Constructors Destructors Member Functions and Classes
Friend Function Dynamic Memory Allocation Static Class Members Container Classes
and Integrators Proxy Classes Overloading: Function overloading and Operator
Overloading.
UNIT II
INHERITANCE & POLYMORPHISM
Base Classes and Derived Classes Protected Members Casting Class pointers and
Member Functions Overriding Public, Protected and Private Inheritance Constructors
and Destructors in derived Classes Implicit Derived Class Object To Base Class Object
Conversion Composition Vs. Inheritance Virtual functions This Pointer Abstract Base
Classes and Concrete Classes Virtual Destructors Dynamic Binding.
UNIT III
LINEAR DATA STRUCTURES
Abstract Data Types (ADTs) List ADT array-based implementation linked list
implementation singly linked lists Polynomial Manipulation - Stack ADT Queue ADT Evaluating arithmetic expressions
UNIT IV
NON-LINEAR DATA STRUCTURES
Trees Binary Trees Binary tree representation and traversals Application of trees: Set
representation and Union-Find operations Graph and its representations Graph Traversals
Representation of Graphs Breadth-first search Depth-first search - Connected
components.
UNIT V
SORTING and SEARCHING
Sorting algorithms: Insertion sort - Quick sort - Merge sort - Searching: Linear search
Binary Search
TEXT BOOKS:
1. Deitel and Deitel, C++, How to Program, Fifth Edition, Pearson Education, 2005.
2. Mark Allen Weiss, Data Structures and Algorithm Analysis in C++,Third Edition,
Addison-Wesley, 2007.
REFERENCES:
1. Bhushan Trivedi, Programming with ANSI C++, A Step-By-Step approach, Oxford
University Press, 2010.
2. Goodrich, Michael T., Roberto Tamassia, David Mount, Data Structures and Algorithms
in C++, 7th Edition, Wiley. 2004.
3. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein,
"Introduction to Algorithms", Second Edition, Mc Graw Hill, 2002.
4. Bjarne Stroustrup, The C++ Programming Language, 3rd Edition, Pearson Education,
2007.
5. Ellis Horowitz, Sartaj Sahni and Dinesh Mehta, Fundamentals of Data Structures in
C++, Galgotia Publications, 2007.

Course Objectives:

To comprehend the fundamentals of object oriented programming, particularly in C+


+.

To understand the concepts of inheritance and polymorphism.

To introduce efficient storage mechanism of data for an easy access. Object oriented
programming is used to implement data structures.

To introduce the non-linear data structures like trees and graphs. To introduce various
techniques for representation of the data in the real world.

To introduce the different types of sorting and searching. To use the concept of
protection and management of data and to develop application using data structures.

Course Outcomes:

Students will write small/medium scale C++ programs with simple graphical user
interface.

Students will understand the model of object oriented programming using inheritance
and polymorphism.

Students will able to use linear data structures like stacks, queues, linked list etc.

Student will able to use non-linear data structures and choose appropriate data
structure as applied to specified problem definition.

Student will able to handle operations like searching, insertion, deletion, traversing
mechanism etc. on various data structures.

UNIT I DATA ABSTRACTION & OVERLOADING


Overview of C++ Structures Class Scope and Accessing Class Members Reference
Variables Initialization Constructors Destructors Member Functions and Classes
Friend Function Dynamic Memory Allocation Static Class Members Container Classes
and Integrators Proxy Classes Overloading: Function overloading and Operator
Overloading.
Overview of C++
Object oriented programming is a programming style that is associated with the concept of
OBJECTS, having data fields and related member functions. 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
and added features. In C++ everything revolves around object of class, which has their
methods & data members.
Main features of object oriented programming which we will be using in C++.
1. Objects
2. Classes
3. Abstraction
4. Encapsulation
5. Inheritance
6. Overloading
7. Exception Handling
8. Continuity
9. Modularization
Objects
Objects are the basic unit of OOP. They are instances of class, which have data members and
use various member functions to perform tasks. Objects are identified by its unique
name.There can be more than one instance of an object. Each instance of an object can hold
its own relevant data.
Class
Classes are data types based on which objects are created. Objects with similar properties and
methods are grouped together to form a Class. Thus Class represents a set of individual
objects. Characteristics of an object are represented in a class as Properties (Attributes) . The
actions that can be performed by objects become functions of the class and is referred to as
Methods (Functions).
For example consider we have a Class of Cars under which Santro Xing, Alto and WaganR
represents individual Objects. In this context each Car Object will have its own, Model, Year

of Manufacture, Colour, Top Speed, Engine Power etc., which form Properties of the Car
class and the associated actions i.e., object functions like Start, Move, Stop form the Methods
of Car Class.

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
Encapsulation is all about binding the data variables and functions together in class. Data
Encapsulation combines data and functions into a single unit called Class. When using Data
Encapsulation, data is not accessed directly; it is only accessible through the functions present
inside the 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
Polymorphism allows routines to use variables of different types at different times. An
operator or function can be given different meanings or functions. Polymorphism refers to a
single function or multi functioning operator performing in different ways. It is a feature, in
which we 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 polymorphism. Where a function or operator is made & defined
many times, to perform different functions they are said to be overloaded. It allows an object
to have different meanings, depending on its context. When an existing operator or function
begins to operate on new data type, or class, it is understood to be overloaded.
Exception Handling
Exception handling is a feature of OOP, to handle unresolved exceptions or errors produced
at runtime.
Continuity
Changes and maintenance in only a few modules does not affect the architecture.

Modularization
Decompose problem into smaller sub-problems that can be solved separately.

Benefits of OOPs
1. Reusability: In OOPs programs functions and modules that are written by a user can
be reused by other users without any modification.
2. Inheritance: Through this we can eliminate redundant code and extend the use of
existing classes.
3. Data Hiding: The programmer can hide the data and functions in a class from other
classes. It helps the programmer to build the secure programs.
4. Reduced complexity of a problem: The given problem can be viewed as a collection
of different objects. Each object is responsible for a specific task. The problem is
solved by interfacing the objects. This technique reduces the complexity of the
program design.
5. Easy to Maintain and Upgrade: OOP makes it easy to maintain and modify existing
code as new objects can be created with small differences to existing ones.
6. Message Passing: The technique of message communication between objects makes
the interface with external systems easier.
7. Modifiability: it is easy to make minor changes in the data representation or the
procedures in an OO program. Changes inside a class do not affect any other part of a
program, since the only public interface that the external world has to a class is
through the use of methods;

Structure of C++
A C++ program consists of the following sections.

Structure of a C++ program


Section 1: Header File Declaration Section
1. Header files used in the program are listed here. Eg. #include<iostream.h>
2. Header File provides Prototype declaration for different library functions.
3. We can also include user define header file.
4. Basically all preprocessor directives are written in this section.
Section 2: Global Declaration Section
1. Global Variables are declared here. Eg. extern int x;
const float x,y,z;
2. Global Declaration may include
a. Declaring Structure
b. Declaring Class
c. Declaring Variable
Section 3: Class Declaration Section
1. Class declaration and all methods of that class are defined here.
2. A class is an organization of data and functions which operate on them. Data types are
called data members and the functions are called member functions. The combination
of data members and member functions constitute a data object or simply an object.

Section 4: Main Function


1. Each and every C++ program always starts with main function.
2. This is entry point for all the function. Each and every method is called indirectly
through main.
3. We can create class objects in the main.
4. Operating system calls this function automatically.
A simple C++ program
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7

#include <iostream>
using namespace std;
int main()
{
cout << "Happy Programming!";
}
// This is a simple C++ program

Output:
Happy Programming!
Line 1: #include <iostream>
1. Lines beginning with a hash sign (#) are directives, read and interpreted by
the preprocessor.
2. They are special lines interpreted before the compilation of the program begins.
3. In this case, the directive#include <iostream>, instructs the preprocessor to include a
section of standard C++ code, known as header iostream, that allows to perform
standard input and output operations, such as writing the output of the program to the
screen.
Line 2: using namespace std;
1. A namespace is used as additional information to differentiate similar functions,
classes, variables etc. with the same name available in different libraries. Using
namespace, we can define the context in which names are defined. In essence, a
namespace defines a scope.
2. std: The std namespace where features of the C++ Standard Library, such
as string or vector, are declared.
Line 3: int main ()
1. This line initiates the declaration of a function. Essentially, a function is a group of
code statements which are given a name: in this case, this gives the name "main" to
the group of code statements that follow.

2. Functions will be discussed in detail in a later chapter, but essentially, their definition
is introduced with a succession of a type (int), a name (main) and a pair of
parentheses (()), optionally including parameters.
3. The function named main is a special function in all C++ programs; it is the function
called when the program is run. The execution of all C++ programs begins with
the main function, regardless of where the function is actually located within the code.
Lines 4 and 6: { and }
1. The open brace ({) at line 4 indicates the beginning of main's function definition, and
the closing brace (}) at line 6, indicates its end.
2. Everything between these braces is the function's body that defines what happens
when main is called. All functions use braces to indicate the beginning and end of
their definitions.
Line 5: cout << "Happy Programming!;
1. This line is a C++ statement. A statement is an expression that can actually produce
some effect. It is the meat of a program, specifying its actual behavior. Statements are
executed in the same order that they appear within a function's body.
2. This
statement
has
two
parts:
First, cout,
which
identifies
the standard character output device (usually, this is the computer screen).
3. Second, the insertion operator also known as left shift operator(<<), which indicates
that what follows is inserted into cout. Finally, a sentence within quotes
("Happy Programming"),is the content inserted into the standard output.
4. Notice that the statement ends with a semicolon (;). This character marks the end of
the statement, just as the fullstop ends a sentence in English. All C++ statements must
end with a semicolon character. One of the most common syntax errors in C++ is
forgetting to end a statement with a semicolon.
Line 7: // This is a simple C++ program
1. Two slash signs indicate that the rest of the line is a comment inserted by the
programmer but which has no effect on the behavior of the program.
2. Programmers use them to include short explanations or observations concerning the
code or program. In this case, it is a brief introductory description of the program.
3. Blank lines have no effect on a program. They simply improve readability of the code.
Compilation & Execution of a C++ Program: (GCC Compiler)
Let's look at how to save the file, compile and run the program. Please follow the steps given
below:

Create a c++ file vi filename.cpp


Open a text editor and write the code.

Save the file as :wq

Type 'g++ hello.cpp ' and press enter to compile the code. If there are no errors in wer
code the command prompt will take we to the next line and would generate a.out
executable file. $ g++ hello.cpp

Now, type ./ a.out to run the program. $ ./a.out

We will see Happy Programming! printed on the window.


Happy Programming!

C++ Datatypes
C++ allows the char, int, and double data types to have modifiers preceding them. A
modifier is used to alter the meaning of the base type so that it more precisely fits the
needs of various situations.
The data type modifiers are listed here:

signed
unsigned

long

short

Type Qualifiers in C++


The type qualifiers provide additional information about the variables they precede.
Qualifier
const
volatile
restrict
Operators in C++

Meaning
Objects of type const cannot be changed by wer program
during execution
The modifier volatile tells the compiler that a variable's
value may be changed in ways not explicitly specified
by the program.
A pointer qualified by restrict is initially the only means
by which the object it points to can be accessed

An operator is a symbol that tells the compiler to perform specific mathematical or


logical manipulations. C++ is rich in built-in operators and provides the following
types of operators:

Arithmetic Operators
Relational Operators

Logical Operators

Bitwise Operators

Assignment Operators

Misc Operators

Arithmetic Operators:
There are following arithmetic operators supported by C++ language:
Assume variable A holds 10 and variable B holds 20, then:
Operator

Description

Example

+
-

Adds two operands


Subtracts second operand from the
first
Multiplies both operands
Divides numerator by de-numerator
Modulus Operator and remainder of
after an integer division
Increment operator, increases integer
value by one
Decrement operator, decreases
integer value by one

A + B will give 30
A - B will give -10

*
/
%
++
-Program: Arithmetic operations

#include <iostream>
using namespace std;
int main()
{
int a = 21;
int b = 10;
int c ;
c = a + b;
cout << "Value of c is :" << c << endl ;
c = a - b;
cout << "Value of c is :" << c << endl ;
c = a * b;
cout << "Value of c is :" << c << endl ;
c = a / b;
cout << "Value of c is :" << c << endl ;
c = a % b;

A * B will give 200


B / A will give 2
B % A will give 0
A++ will give 11
A-- will give 9

cout << "Value of c is :" << c << endl ;


c = a++;
cout << "Value of c is :" << c << endl ;
c = a--;
cout << "Value of c is :" << c << endl ;
return 0;
}
Output:
Value of c is: 31
Value of c is: 11
Value of c is: 210
Value of c is: 2
Value of c is: 1
Value of c is: 21
Value of c is: 22
Relational Operators:
These are the following relational operators supported by C++ language
Assume variable A holds 10 and variable B holds 20, then:
Operator
==
!=
>
<
>=
<=

Description
Checks if the values of two operands
are equal or not, if yes then condition
becomes true.
Checks if the values of two operands are equal
or not, if values are not equal then condition
becomes true.
Checks if the value of left operand is greater
than the value of right operand, if yes then
condition becomes true.
Checks if the value of left operand is less than
the value of right operand, if yes then condition
becomes true.
Checks if the value of left operand is greater
than or equal to the value of right operand, if
yes then condition becomes true.
Checks if the value of left operand is less than
or equal to the value of right operand, if yes
then condition becomes true.

Program: Comparing 2 numbers


#include <iostream>
using namespace std;
main()
{
int a = 21;
int b = 10;
int c ;

Example
(A == B) is not
true.
(A != B) is true.
(A > B) is not
true.
(A < B) is true.
(A >= B) is not
true.
(A <= B) is true.

if ( a < b )
{
cout << a is less than b" << endl ;
}
else
{
cout << "a is not less than b" << endl ;
}
}
Output:
A is not less than b
Logical Operators:
There are following logical operators supported by C++ language
Assume variable A holds 1 and variable B holds 0, then:
Operator
Description
&&
Called Logical AND operator. If both the operands are
non-zero, then condition becomes true.
||
Called Logical OR Operator. If any of the two
operands is non-zero, then condition becomes true.
!
Called Logical NOT Operator. Use to reverses the
logical state of its operand. If a condition is true, then
Logical NOT operator will make false.
Program: Manipulating Logical operators
#include <iostream>
using namespace std;
main()
{
int a = 5;
int b = 20;
int c ;
if ( a && b )
{
cout << "Line 1 - Condition is true"<< endl ;
}
if ( a || b )
{
cout << "Line 2 - Condition is true"<< endl ;
}
}
Output
Line 1 - Condition is true
Line 2 - Condition is true

Example
(A && B) is false.
(A || B) is true.
!(A && B) is true.

Bitwise Operators:
Bitwise operator works on bits and performs bit-by-bit operation. The truth tables for
&, |, and ^ are as follows:
p
0
0
1
1

q
0
1
1
0

p&q
0
0
1
0

p|q
0
1
1
1

p^q
0
1
0
1

The Bitwise operators supported by C++ language are listed in the following table.
Assume variable A holds 60 and variable B holds 13, then:
Operator
Description
&
Binary AND Operator copies a bit to the
result if it exists in both operands.
|
Binary OR Operator copies a bit if it
exists in either operand.
^
Binary XOR Operator copies the bit if it
is set in one operand but not both.
~
Binary Ones Complement Operator is
unary and has the effect of 'flipping' bits.
<<

Binary Left Shift Operator. The left


operands value is moved left by the
number of bits specified by the right
operand.
Binary Right Shift Operator. The left
operands value is moved right by the
number of bits specified by the right
operand.

>>

Example
(A & B) will give 12 which is
0000 1100
(A | B) will give 61 which is
0011 1101
(A ^ B) will give 49 which is
0011 0001
(~A ) will give -61 which is
1100 0011 in 2's complement
form due to a signed binary
number.
A << 2 will give 240 which is
1111 0000
A >> 2 will give 15 which is
0000 1111

Assignment Operators:
There are following assignment operators supported by C++ language:
Operator
Description
=
Simple assignment operator, Assigns values from
right side operands to left side operand
+=
-=
*=

Add AND assignment operator, It adds right operand


to the left operand and assign the result to left
operand
Subtract AND assignment operator, It subtracts right
operand from the left operand and assign the result
to left operand
Multiply AND assignment operator, It multiplies
right operand with the left operand and assign the
result to left operand

Example
C = A + B will
assign value of A +
B into C
C += A is
equivalent to C =
C+A
C -= A is
equivalent to C =
C-A
C *= A is
equivalent to C =
C*A

/=

<<=

Divide AND assignment operator, It divides left


operand with the right operand and assign the result
to left operand
Modulus AND assignment operator, It takes
modulus using two operands and assign the result to
left operand
Left shift AND assignment operator

>>=

Right shift AND assignment operator

&=

Bitwise AND assignment operator

^=

bitwise exclusive OR and assignment operator

|=

bitwise inclusive OR and assignment operator

%=

C /= A is
equivalent to C =
C/A
C %= A is
equivalent to C =
C%A
C <<= 2 is same as
C = C << 2
C >>= 2 is same as
C = C >> 2
C &= 2 is same as
C=C&2
C ^= 2 is same as
C=C^2
C |= 2 is same as C
=C|2

Misc Operators
There are few other operators supported by C++ Language.
Operator
sizeof
Condition ? X : Y
,
. (dot) and -> (arrow)
Cast
&
*

Description
sizeof operator returns the size of a variable. For example, sizeof(a),
where a is integer, will return 4.
Conditional operator. If Condition is true ? then it returns value X :
otherwise value Y
Comma operator causes a sequence of operations to be performed.
The value of the entire comma expression is the value of the last
expression of the comma-separated list.
Member operators are used to reference individual members of
classes, structures, and unions.
Casting operators convert one data type to another. For example,
int(2.2000) would return 2.
Pointer operator & returns the address of an variable. For example
&a; will give actual address of the variable.
Pointer operator * is pointer to a variable. For example *var; will
pointer to a variable var.

Operators Precedence in C++:


Operator precedence determines the grouping of terms in an expression. This affects
how an expression is evaluated. Certain operators have higher precedence than others;
for example, the multiplication operator has higher precedence than the addition
operator:
For example x = 7 + 3 * 2; here, x is assigned 13, not 20 because operator * has
higher precedence than +, so it first gets multiplied with 3*2 and then adds into 7.
Here, operators with the highest precedence appear at the top of the table, those with
the lowest appear at the bottom. Within an expression, higher precedence operators
will be evaluated first.

Category
Postfix
Unary
Multiplicative
Additive
Shift
Relational
Equality
Bitwise AND
Bitwise XOR
Bitwise OR
Logical AND
Logical OR
Conditional
Assignment
Comma

Operator
() [] -> . ++ - + - ! ~ ++ - - (type)* & sizeof
*/%
+<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= %=>>= <<= &= ^= |=
,

Associativity
Left to right
Right to left
Left to right
Left to right
Left to right
Left to right
Left to right
Left to right
Left to right
Left to right
Left to right
Left to right
Right to left
Right to left
Left to right

Decision making statements


Decision making structures require that the programmer specify one or more conditions to be
evaluated or tested by the program, along with a statement or statements to be executed if the
condition is determined to be true, and optionally, other statements to be executed if the
condition is determined to be false.
Following is the general from of a typical decision making structure found in most of the
programming languages:

C++ programming language provides following types of decision making statements.


Statement

Description

if statement

An if statement consists of a boolean expression


followed by one or more statements.

if...else statement

An if statement can be followed by an optional else


statement, which executes when the boolean
expression is false.

switch statement

A switch statement allows a variable to be tested for


equality against a list of values.

nested if statements

We can use one if or else if statement inside another


if or else if statement(s).

nested switch statements

We can use one swicth statement inside another


switch statement(s).

if statement
An if statement consists of a boolean expression followed by one or more statements.
Syntax:
The syntax of an if statement in C++ is:
if(boolean_expression)
{
// statement(s) will execute if the boolean expression is true
}

If the boolean expression evaluates to true, then the block of code inside the if statement will
be executed. If boolean expression evaluates to false, then the first set of code after the end of
the if statement (after the closing curly brace) will be executed.
Example:
#include <iostream>
using namespace std;
int main ()
{
// local variable declaration:
int a = 10;
// check the boolean condition
if( a < 20 )
{
// if condition is true then print the following
cout << "a is less than 20;" << endl;
}
cout << "value of a is : " << a << endl;
return 0;
}
When the above code is compiled and executed, it produces the following result:
a is less than 20;
value of a is : 10
If else Statement
An if statement can be followed by an optional else statement, which executes when the
boolean expression is false.
Syntax:
The syntax of an if...else statement in C++ is:
if(boolean_expression)
{
// statement(s) will execute if the boolean expression is true
}
else
{
// statement(s) will execute if the boolean expression is false
}
If the boolean expression evaluates to true, then the if block of code will be executed,
otherwise else block of code will be executed.
Example:
#include <iostream>
using namespace std;
int main ()
{
// local variable declaration:

int a = 100;
// check the boolean condition
if( a < 20 )
{
// if condition is true then print the following
cout << "a is less than 20;" << endl;
}
else
{
// if condition is false then print the following
cout << "a is not less than 20;" << endl;
}
cout << "value of a is : " << a << endl;
return 0;
}
When the above code is compiled and executed, it produces the following result:
a is not less than 20;
value of a is : 100
The if...else if...else Statement:
An if statement can be followed by an optional else if...else statement, which is very
usefull to test various conditions using single if...else if statement.
Syntax:
The syntax of an if...else if...else statement in C++ is:
if(boolean_expression 1)
{
// Executes when the boolean expression 1 is true
}
else if( boolean_expression 2)
{
// Executes when the boolean expression 2 is true
}
else if( boolean_expression 3)
{
// Executes when the boolean expression 3 is true
}
else
{
// executes when the none of the above condition is true.
}
Example:
#include <iostream>

using namespace std;


int main ()
{
// local variable declaration:
int a = 100;
// check the boolean condition
if( a == 10 )
{
// if condition is true then print the following
cout << "Value of a is 10" << endl;
}
else if( a == 20 )
{
// if else if condition is true
cout << "Value of a is 20" << endl;
}
else if( a == 30 )
{
// if else if condition is true
cout << "Value of a is 30" << endl;
}
else
{
// if none of the conditions is true
cout << "Value of a is not matching" << endl;
}
cout << "Exact value of a is : " << a << endl;
return 0;
}
When the above code is compiled and executed, it produces the following result:
Value of a is not matching
Exact value of a is : 100

Switch statement
A switch statement allows a variable to be tested for equality against a list of values.
Each value is called a case, and the variable being switched on is checked for each case.
Syntax:
The syntax for a switch statement in C++ is as follows:
switch(expression){
case constant-expression :

statement(s);
break; //optional
case constant-expression :
statement(s);
break; //optional
// we can have any number of case statements.
default : //Optional
statement(s);
}
The following rules apply to a switch statement:
The expression used in a switch statement must have an integral or enumerated type,
or be of a class type in which the class has a single conversion function to an integral
or enumerated type.
We can have any number of case statements within a switch. Each case is followed by
the value to be compared to and a colon.
The constant-expression for a case must be the same data type as the variable in the
switch, and it must be a constant or a literal.
When the variable being switched on is equal to a case, the statements following that
case will execute until a break statement is reached.
When a break statement is reached, the switch terminates, and the flow of control
jumps to the next line following the switch statement.
Not every case needs to contain a break. If no break appears, the flow of control
will fall through to subsequent cases until a break is reached.
A switch statement can have an optional default case, which must appear at the end of
the switch. The default case can be used for performing a task when none of the cases
is true. No break is needed in the default case.
Example:
#include <iostream>
using namespace std;
int main ()
{
// local variable declaration:
char grade = 'D';
switch(grade)
{
case 'A' :
cout << "Excellent!" << endl;
break;
case 'B' :
case 'C' :
cout << "Well done" << endl;
break;

case 'D' :
cout << "We passed" << endl;
break;
case 'F' :
cout << "Better try again" << endl;
break;
default :
cout << "Invalid grade" << endl;
}
cout << "Wer grade is " << grade << endl;
return 0;
}
Output:
We passed
Wer grade is D
Nested if-else statements
It is always legal to nest if-else statements, which means we can use one if or else if
statement inside another if or else if statement(s).
Syntax:
The syntax for a nested if statement is as follows:
if( boolean_expression 1)
{
// Executes when the boolean expression 1 is true
if(boolean_expression 2)
{
// Executes when the boolean expression 2 is true
}
}
We can nest else if...else in the similar way as we have nested if statement.
Example:
#include <iostream>
using namespace std;
int main ()
{
// local variable declaration:
int a = 100;
int b = 200;
// check the boolean condition
if( a == 100 )
{
// if condition is true then check the following
if( b == 200 )

{
// if condition is true then print the following
cout << "Value of a is 100 and b is 200" << endl;
}
}
cout << "Exact value of a is : " << a << endl;
cout << "Exact value of b is : " << b << endl;
return 0;
}
Output:
Value of a is 100 and b is 200
Exact value of a is: 100
Exact value of b is: 200
The ? : Operator:
General form:
Exp1 ? Exp2 : Exp3;
Where Exp1, Exp2, and Exp3 are expressions. Notice the use and placement of the colon.
The value of a ? expression is determined like this: Exp1 is evaluated. If it is true, then Exp2
is evaluated and becomes the value of the entire ? expression. If Exp1 is false, then Exp3 is
evaluated and its value becomes the value of the expression.
Program:
#include <iostream>
using namespace std;
int main ()
{
// Local variable declaration:
int x, y = 10;
x = (y < 10) ? 30 : 40;
cout << "value of x: " << x << endl;
return 0;
}
Output:
value of x: 40

Looping Statements:
There may be a situation, when we need to execute a block of code several number of
times. In general statements are executed sequentially: The first statement in a function is
executed first, followed by the second, and so on.
Programming languages provide various control structures that allow for more complicated
execution paths.

A loop statement allows us to execute a statement or group of statements multiple times and
following is the general from of a loop statement in most of the programming languages:

C++ programming language provides the following types of loop to handle looping
requirements.
Loop Type
while loop

for loop
do...while loop
nested loops

Description
Repeats a statement or group of statements while a given
condition is true. It tests the condition before executing
the loop body.
Execute a sequence of statements multiple times and
abbreviates the code that manages the loop variable.
Like a while statement, except that it tests the condition
at the end of the loop body
We can use one or more loop inside any another while,
for or do..while loop.

while loop
A while loop statement repeatedly executes a target statement as long as a given condition is
true.
Syntax:
while(condition)
{
statement(s);
}
Here, statement(s) may be a single statement or a block of statements. The condition may be
any expression, and true is any non-zero value. The loop iterates while the condition is true.
When the condition becomes false, program control passes to the line immediately following
the loop.

Here, key point of the while loop is that the loop might not ever run. When the
condition is tested and the result is false, the loop body will be skipped and the first statement
after the while loop will be executed.
Example:
#include <iostream>
using namespace std;
int main ()
{
// Local variable declaration:
int a = 10;
// while loop execution
while( a < 20 )
{
cout << "value of a: " << a << endl;
a++;
}
return 0;
}
Output:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
for loop
A for loop is a repetition control structure that allows we to efficiently write a loop that needs
to execute a specific number of times.
Syntax:
for ( init; condition; increment )
{
statement(s);
}
Here is the flow of control in a for loop:
The init step is executed first, and only once. This step allows we to declare and
initialize any loop control variables. We are not required to put a statement here, as
long as a semicolon appears.

Next, the condition is evaluated. If it is true, the body of the loop is executed. If it is
false, the body of the loop does not execute and flow of control jumps to the next
statement just after the for loop.
After the body of the for loop executes, the flow of control jumps back up to
theincrement statement. This statement allows we to update any loop control
variables. This statement can be left blank, as long as a semicolon appears after the
condition.
The condition is now evaluated again. If it is true, the loop executes and the process
repeats itself (body of loop, then increment step, and then again condition). After the
condition becomes false, the for loop terminates.

Example:
#include <iostream>
using namespace std;
int main ()
{
// for loop execution
for( int a = 10; a < 20; a = a + 1 )
{
cout << "value of a: " << a << endl;
}
return 0;
}
Output:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19
do...while loop
A do...while loop is similar to a while loop, except that a do...while loop is guaranteed to
execute at least one time.
Syntax:
do
{
statement(s);
}while( condition );

Notice that the conditional expression appears at the end of the loop, so the statement(s) in
the loop execute once before the condition is tested.
If the condition is true, the flow of control jumps back up to do, and the statement(s) in the
loop execute again. This process repeats until the given condition becomes false.
Example:
#include <iostream>
using namespace std;
int main ()
{
// Local variable declaration:
int a = 10;
// do loop execution
do
{
cout << "value of a: " << a << endl;
a = a + 1;
}while( a < 20 );
return 0;
}
When the above code is compiled and executed, it produces the following result:
value of a: 10
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 15
value of a: 16
value of a: 17
value of a: 18
value of a: 19

Arrays:
1.
C++ provides a data structure, the array, which stores a fixed-size sequential
collection of elements of the same type. An array is used to store a collection of data,

but it is often more useful to think of an array as a collection of variables of the same
type.
2.
Instead of declaring individual variables, such as number0, number1, ..., and
number99, we declare one array variable such as numbers and use numbers[0],
numbers[1], and ..., numbers[99] to represent individual variables. A specific element
in an array is accessed by an index.
3.
All arrays consist of contiguous memory locations. The lowest address corresponds
to the first element and the highest address to the last element.
Declaring Arrays:
1. To declare an array in C++, the programmer specifies the type of the elements and the
number of elements required by an array as follows:
type arrayName [ arraySize ];
This is called a single-dimension array.
2. The arraySize must be an integer constant greater than zero and type can be any valid
C++ data type. For example, to declare a 10-element array called balance of type
double, use this statement:
double balance[10];
Initializing Arrays:
1. we can initialize C++ array elements either one by one or using a single statement as
follows:
float balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
The number of values between braces { } cannot be larger than the number of elements that
we declare for the array between square brackets [ ]. Following is an example to assign a
single element of the array:
If we omit the size of the array, an array just big enough to hold the initialization is created.
Therefore, if we write:
float balance[] = {1000.0, 2.0, 3.4, 17.0, 50.0};
we will create exactly the same array as we did in the previous example.
balance[4] = 50.0;
The above statement assigns element number 5th in the array a value of 50.0. Array with 4th
index will be 5th, i.e., last element because all arrays have 0 as the index of their first element
which is also called base index. Following is the pictorial representaion of the same array we
discussed above:

Accessing Array Elements:


An element is accessed by indexing the array name. This is done by placing the index
of the element within square brackets after the name of the array. For example:
float salary = balance[9];
The above statement will take 10th element from the array and assign the value to salary
variable. Following is an example, which will use all the above-mentioned three concepts viz.
declaration, assignment and accessing arrays:

Program:
#include <iostream>
using namespace std;
int main()
{
int n[5];
cout<<"Enter 5 numbers: ";
/* Storing 5 number entered by user in an array using for loop. */
for (int i = 0; i < 5; ++i)
{
cin>>n[i];
}
cout<<"First number: "<<n[0]<<endl; // first element of an array is n[0]
cout<<"Last number: "<<n[4];
// last element of an array is n[SIZE_OF_ARRAY - 1]
return 0;
}
Output:
Enter 5 numbers: 4
-3
5
2
0
First number: 4
Last number: 0
String:
C++ provides following two types of string representations:
The C-style character string.
The string class type introduced with Standard C++.
The C-Style Character String:
1. The C-style character string originated within the C language and continues to be
supported within C++.
2. This string is actually a one-dimensional array of characters which is terminated by
a null character '\0'. Thus a null-terminated string contains the characters that
comprise the string followed by a null.
The following declaration and initialization create a string consisting of the word "Hello". To
hold the null character at the end of the array, the size of the character array containing the
string is one more than the number of characters in the word "Hello."
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
If we follow the rule of array initialization, then we can write the above statement as follows:
char greeting[] = "Hello";
Following is the memory presentation of above defined string in C/C++:

Actually, we do not place the null character at the end of a string constant. The C++ compiler
automatically places the '\0' at the end of the string when it initializes the array. Let us try to
print above-mentioned string:
#include <iostream>
using namespace std;
int main ()
{
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << "Greeting message: ";
cout << greeting << endl;
return 0;
}
Output:
Greeting message: Hello
C++ supports a wide range of functions that manipulate null-terminated strings:
S.N. Function & Purpose
1
strcpy(s1, s2);
Copies string s2 into string s1.
2
strcat(s1, s2);
Concatenates string s2 onto the end of string s1.
3
strlen(s1);
Returns the length of string s1.
4
strcmp(s1, s2);
Returns 0 if s1 and s2 are the same; less than 0 if s1<s2; greater than 0 if s1>s2.
5
strchr(s1, ch);
Returns a pointer to the first occurrence of character ch in string s1.
6
strstr(s1, s2);
Returns a pointer to the first occurrence of string s2 in string s1.
Following example makes use of few of the above-mentioned functions:
#include <iostream>
#include <cstring>
using namespace std;
int main ()

{
char str1[10] = "Hello";
char str2[10] = "World";
char str3[10];
int len ;
// copy str1 into str3
strcpy( str3, str1);
cout << "strcpy( str3, str1) : " << str3 << endl;
// concatenates str1 and str2
strcat( str1, str2);
cout << "strcat( str1, str2): " << str1 << endl;
// total lenghth of str1 after concatenation
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;
}
Output:
strcpy( str3, str1) : Hello
strcat( str1, str2): HelloWorld
strlen(str1) : 10
The String Class in C++:
The standard C++ library provides a string class type that supports all the operations
mentioned above, additionally much more functionality.
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str1 = "Hello";
string str2 = "World";
string str3;
int len ;
// copy str1 into str3
str3 = str1;
cout << "str3 : " << str3 << endl;
// concatenates str1 and str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// total lenghth of str3 after concatenation
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}

Output:
str3 : Hello
str1 + str2 : HelloWorld
str3.size() : 10
C++ standard libraries
The C++ standard libraries provide an extensive set of input/output capabilities which
we will see in subsequent chapters. This chapter will discuss very basic and most common
I/O operations required for C++ programming.
C++ I/O occurs in streams, which are sequences of bytes. If bytes flow from a device like a
keyboard, a disk drive, or a network connection etc. to main memory, this is called input
operation and if bytes flow from main memory to a device like a display screen, a printer, a
disk drive, or a network connection, etc, this is called output operation.
I/O Library Header Files:
There are following header files important to C++ programs:
Header File
Function and Description
This file defines the cin, cout, cerr and clog objects, which correspond to
<iostream>
the standard input stream, the standard output stream, the un-buffered
standard error stream and the buffered standard error stream, respectively.
This file declares services useful for performing formatted I/O with so<iomanip>
called parameterized stream manipulators, such as setw and setprecision.
This file declares services for user-controlled file processing. We will
<fstream>
discuss about it in detail in File and Stream related chapter.
The standard output stream (cout):
The predefined object cout is an instance of ostream class. The cout object is said to be
"connected to" the standard output device, which usually is the display screen. The cout is
used in conjunction with the stream insertion operator, which is written as << which are two
less than signs as shown in the following example.
#include <iostream>
using namespace std;
int main( )
{
char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;
}
Output:
Value of str is : Hello C++
The C++ compiler also determines the data type of variable to be output and selects the
appropriate stream insertion operator to display the value. The << operator is overloaded to
output data items of built-in types integer, float, double, strings and pointer values.
The insertion operator << may be used more than once in a single statement as shown above
and endl is used to add a new-line at the end of the line.
The standard input stream (cin):

The predefined object cin is an instance of istream class. The cin object is said to be
attached to the standard input device, which usually is the keyboard. The cin is used in
conjunction with the stream extraction operator(right shift operator), which is written as >>
which are two greater than signs as shown in the following example.
#include <iostream>
using namespace std;
int main( )
{
char name[50];
cout << "Please enter your name: ";
cin >> name;
cout << "Your name is: " << name << endl;
}
Output:
Please enter your name: cplusplus
Your name is: cplusplus
The C++ compiler also determines the data type of the entered value and selects the
appropriate stream extraction operator to extract the value and store it in the given variables.
The stream extraction operator >> may be used more than once in a single statement. To
request more than one datum you can use the following:
cin >> name >> age;
This will be equivalent to the following two statements:
cin >> name;
cin >> age;
Structure in C++
C/C++ arrays allow you to define variables that combine several data items of the
same kind but structure is another user defined data type which allows you to combine data
items of different kinds.
Structures are used to represent a record, suppose you want to keep track of your books in a
library. You might want to track the following attributes about each book:
Title
Author
Subject
Book ID

Defining a Structure:
To define a structure, you must use the struct statement. The struct statement defines a new
data type, with more than one member, for your program. The format of the struct statement
is this:

struct [structure tag]


{
member definition;
member definition;
...
member definition;
} [one or more structure variables];
The structure tag is optional and each member definition is a normal variable definition,
such as int i; or float f; or any other valid variable definition. At the end of the structure's
definition, before the final semicolon, you can specify one or more structure variables but it is
optional. Here is the way you would declare the Book structure:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}book;
Accessing Structure Members:
To access any member of a structure, we use the member access operator (.). The member
access operator is coded as a period between the structure variable name and the structure
member that we wish to access. You would use struct keyword to define variables of
structure type. Following is the example to explain usage of structure:\
#include <iostream>
#include <cstring>
using namespace std;
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
struct Books Book1;
struct Books Book2;

// Declare Book1 of type Book


// Declare Book2 of type Book

// book 1 specification
strcpy( Book1.title, "Learn C++ Programming");
strcpy( Book1.author, "Chand Miyan");
strcpy( Book1.subject, "C++ Programming");

Book1.book_id = 6495407;
// book 2 specification
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Yakit Singha");
strcpy( Book2.subject, "Telecom");
Book2.book_id = 6495700;
// Print Book1 info
cout << "Book 1 title : " << Book1.title <<endl;
cout << "Book 1 author : " << Book1.author <<endl;
cout << "Book 1 subject : " << Book1.subject <<endl;
cout << "Book 1 id : " << Book1.book_id <<endl;
// Print Book2 info
cout << "Book 2 title : " << Book2.title <<endl;
cout << "Book 2 author : " << Book2.author <<endl;
cout << "Book 2 subject : " << Book2.subject <<endl;
cout << "Book 2 id : " << Book2.book_id <<endl;
return 0;
}
Output:
Book 1 title : Learn C++ Programming
Book 1 author : Chand Miyan
Book 1 subject : C++ Programming
Book 1 id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Yakit Singha
Book 2 subject : Telecom
Book 2 id : 6495700
Function
1. A function is a group of statements that together perform a task. Every C++
program has at least one function, which is main(), and all the most trivial
programs can define additional functions.
2. You can divide up your code into separate functions. How you divide up your code
among different functions is up to you, but logically the division usually is so each
function performs a specific task.
3. A function declaration tells the compiler about a function's name, return type, and
parameters. A function definition provides the actual body of the function.
4. The C++ standard library provides numerous built-in functions that your program
can call. For example, function strcat() to concatenate two strings, function
memcpy() to copy one memory location to another location and many more
functions. A function is knows as with various names like a method or a subroutine or a procedure etc.
Defining a Function:
The general form of a C++ function definition is as follows:

return_type function_name( parameter list )


{
body of the function
}
A C++ function definition consists of a function header and a function body. Here are all the
parts of a function:
Return Type: A function may return a value. The return_type is the data type of the
value the function returns. Some functions perform the desired operations without
returning a value. In this case, the return_type is the keyword void.
Function Name: This is the actual name of the function. The function name and the
parameter list together constitute the function signature.
Parameters: A parameter is like a placeholder. When a function is invoked, you pass
a value to the parameter. This value is referred to as actual parameter or argument.
The parameter list refers to the type, order, and number of the parameters of a
function. Parameters are optional; that is, a function may contain no parameters.
Function Body: The function body contains a collection of statements that define
Function Declarations:
A function declaration tells the compiler about a function name and how to call the function.
The actual body of the function can be defined separately. A function declaration has the
following parts:
return_type function_name( parameter list );
For the above defined function max(), following is the function declaration:
int max(int num1, int num2);
Function declaration is required when you define a function in one source file and you call
that function in another file. In such case, you should declare the function at the top of the file
calling the function.
Calling a Function:
While creating a C++ function, you give a definition of what the function has to do. To use a
function, you will have to call or invoke that function.
When a program calls a function, program control is transferred to the called function. A
called function performs defined task and when its return statement is executed or when its
function-ending closing brace is reached, it returns program control back to the main
program.
To call a function, you simply need to pass the required parameters along with function name,
and if function returns a value, then you can store returned value. For example:

Program:
#include <iostream>
using namespace std;
// function declaration
int max(int num1, int num2);

int main ()
{
// local variable declaration:
int a = 100;
int b = 200;
int ret;
// calling a function to get max value.
ret = max(a, b);
cout << "Max value is : " << ret << endl;
return 0;
}
// function returning the max between two numbers
int max(int num1, int num2)
{
// local variable declaration
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
Output:
Max value is : 200
Function Arguments:
If a function is to use arguments, it must declare variables that accept the values of the
arguments. These variables are called the formal parameters of the function.
The formal parameters behave like other local variables inside the function and are created
upon entry into the function and destroyed upon exit.
While calling a function, there are two ways that arguments can be passed to a function:
Call Type
Description
Call by value
This method copies the actual value of an argument into the
formal parameter of the function. In this case, changes made to
the parameter inside the function have no effect on the argument.
Call by pointer
This method copies the address of an argument into the formal
parameter. Inside the function, the address is used to access the
actual argument used in the call. This means that changes made
to the parameter affect the argument.
Call by reference
This method copies the reference of an argument into the formal
parameter. Inside the function, the reference is used to access the
actual argument used in the call. This means that changes made
to the parameter affect the argument.

By default, C++ uses call by value to pass arguments. In general, this means that code within
a function cannot alter the arguments used to call the function and above mentioned example
while calling max() function used the same method.

Classes and Objects


A class is the collection of related data and function under a single name. A C++ program can
have any number of classes. When related data and functions are kept under a class, it helps
to visualize the complex problem efficiently and effectively.

C++ Class Definitions:


Below is the syntax of class definition,
class ClassName
{
Access specifier:
Data members;
Member Functions(){}
};

Accessing a data member depends solely on the access control of that data member. If its
public, then the data member can be easily accessed using the direct member access (.)
operator with the object of that class.
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 and setter functions.

C++ Objects
When class is defined, only specification for the object is defined. Object has same
relationship to class as variable has with the data type. Objects can be defined in similar way
as structure is defined.
Syntax to Define Object in C++
class_name variable name;
For the above defined class temp, objects for that class can be defined as:
temp obj1;
temp obj2;
Program: Displaying student details using 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";
cout <<"Name and Roll no of A is :"<< A.name << A.rollno;
cout <<"Name and Roll no of B is :"<< B.name << B.rollno;
}
Output:
Name and Roll no of A is Adam
Name and Roll no of B is Bella

Program: Adding two number using class


#include<iostream.h>
#include<conio.h>
class add
{

public:
int a,b,c;
public:
void read()
{
cout<<"enter Two Number "<<endl;
cin>>a>>b;
}
void display()
{
cout<<" A = "<<a<<endl;
cout<<" B = "<<b<<endl;
cout<<"Sum = "<<c<<endl;
}
void sum()
{
c= a+b;
}
};
void main()
{
add x; // x is a object off add
clrscr();
x.read();
x.sum();
x.display();
getch();
}
Output:
enter Two Number 5 10
A =5
B = 10
Sum = 15
Program:
#include <iostream>
using namespace std;
class Box
{
public:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
}
int main( )

{
Box Box1; // Declare Box1 of type Box
Box Box2; // Declare Box2 of type Box
double volume = 0.0; // Store the volume of a box here
// box 1 specification
Box1.height = 4.0;
Box1.length = 6.0;
Box1.breadth = 3.0;
// box 2 specification
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 12.0;
// volume of box 1
volume = Box1.height * Box1.length * Box1.breadth;
cout << "Volume of Box1 : " << volume <<endl;
// volume of box 2
volume = Box2.height * Box2.length * Box2.breadth;
cout << "Volume of Box2 : " << volume <<endl;
return 0;
}
Output:
Volume of Box1: 210
Volume of Box2: 1560
Scope resolution operator ::
Scope resolution operator(::) is used to define a function outside a class or when we want to
use a global variable but also has a local variable with same name.
Program using scope resolution operator:
#include <iostream>
using namespace std;
class Box
{
public:
double length;
// Length of a box
double breadth;
// Breadth of a box
double height;
// Height of a box
// Member functions declaration
double getVolume(void);
void setLength( double len );

void setBreadth( double bre );


void setHeight( double hei );
};
// Member functions definitions
double Box::getVolume(void)
{
return length * breadth * height;
}
void Box::setLength( double len )
{
length = len;
}
void Box::setBreadth( double bre )
{
breadth = bre;
}
void Box::setHeight( double hei )
{
height = hei;
}
// Main function for the program
int main( )
{
Box Box1;
// Declare Box1 of type Box
Box Box2;
// Declare Box2 of type Box
double volume = 0.0; // Store the volume of a box here
// box 1 specification
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// box 2 specification
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// volume of box 1
volume = Box1.getVolume();
cout << "Volume of Box1 : " << volume <<endl;
// volume of box 2

volume = Box2.getVolume();
cout << "Volume of Box2 : " << volume <<endl;
return 0;
}
Output:
Volume of Box1 : 210
Volume of Box2 : 1560
Class Scope and Accessing Class Members
Access Control in Classes
Now before studying how to define class and its objects, lets first quickly learn what are
access specifiers.
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
{
public: // public access specifier
int x;
// Data Member Declaration
void display(); // Member Function decaration
}
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
{
private: // private access specifier
int x;
// Data Member Declaration
void display(); // Member Function decaration
}

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
{
protected: // protected access specifier
int x;
// Data Member Declaration
void display(); // Member Function decaration
}

Constructors
Constructors are special class functions which performs initialization of every object. The
Compiler calls the Constructor whenever an object is created. Constructors initialize values to
object members after storage is allocated to the object.

class A
{
int x;
public:
A(); //Constructor
};
While defining a constructor you must remember that the name of constructor will be same as
the name of the class, and constructors 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:
A(); //Constructor declared
};
A::A() // Constructor definition
{
i=1;
}
Types of Constructors
Constructors are of three types:
1. Default Constructor
2. Parameterized Constructor
3. Copy Constructor
1. Default Constructor
Default constructor is the constructor which doesn't take any argument. It has no parameter.
Syntax :
class_name ()
{ Constructor Definition }
Example :
#include<iostream.h>
using namespace std;
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;
cout << c.side;
}
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);
cout << c1.side;
cout << c2.side;
cout << c3.side;
}
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.
#include<iostream>
using namespace std;
class Point
{
private:
int x, y;
public:
Point(int x1, int y1)
{
x = x1;
y = y1;
}
// Copy constructor
Point(const Point &p2)
{
x = p2.x;
y = p2.y;
}
int getX()
{
return x;
}
int getY()
{
return y;
}
};
int main()
{
Point p1(10, 15); // Normal constructor is called here
Point p2 = p1; // Copy constructor is called here
// Let us access values assigned by constructors

cout << "p1.x = " << p1.getX() << ", p1.y = " << p1.getY();
cout << "\np2.x = " << p2.getX() << ", p2.y = " << p2.getY();
return 0;
}
Output:
p1.x = 10, p1.y = 15
p2.x = 10, p2.y = 15
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.
we can have any number of Constructors in a class that differ in parameter list.
Program:
#include<iostream.h>
using namespace std;
class Student
{
int rollno;
string name;
public:
Student(int x)
{
rollno=x;
name="None";
}
Student(int x, string str)
{
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 we 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();
};
Destructors will never have any arguments.
Example to see how Constructor and Destructor is called
class A
{
A()
{
cout << "Constructor called";
}
~A()
{
cout << "Destructor called";
}
};
int main()
{
A obj1; // Constructor Called
int x=1
if(x)
{
A obj2; // Constructor Called
} // Destructor Called for obj2
} // Destructor called for obj1

Single Definition for both Default and Parameterized Constructor


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.
Member Functions:
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;
int getVolume();
};

// Declaring function getVolume with no argument and return type int.

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()
{
return side*side*side;
}
};

//returns volume of cube

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();
}
int Cube :: getVolume()
{
return side*side*side;
}

// defined outside class definition

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;
C1.side=4; // setting side value
cout<< "Volume of cube C1 ="<< C1.getVolume();
}
Similarly we can define the getter and setter functions to access private data members, inside
or outside the class definition.
Friend function:
refer balagurusamy book

Dynamic Memory

A good understanding of how dynamic memory really works in C++ is essential to becoming
a good C++ programmer. Memory in your C++ program is divided into two parts:

The stack: All variables declared inside the function will take up memory from the
stack.

The heap: This is unused memory of the program and can be used to allocate the
memory dynamically when program runs.

Many times, you are not aware in advance how much memory you will need to store
particular information in a defined variable and the size of required memory can be
determined at run time.
You can allocate memory at run time within the heap for the variable of a given type using a
special operator in C++ which returns the address of the space allocated. This operator is
called new operator.
If you are not in need of dynamically allocated memory anymore, you can use delete
operator, which de-allocates memory previously allocated by new operator.
The new and delete operators:
There is following generic syntax to use new operator to allocate memory dynamically for
any data-type.
new data-type;
Here, data-type could be any built-in data type including an array or any user defined data
types include class or structure. Let us start with built-in data types. For example we can
define a pointer to type double and then request that the memory be allocated at execution
time. We can do this using the new operator with the following statements:
double* pvalue = NULL; // Pointer initialized with null
pvalue = new double; // Request memory for the variable
The memory may not have been allocated successfully, if the free store had been used up. So
it is good practice to check if new operator is returning NULL pointer and take appropriate
action as below:
double* pvalue = NULL;
if( !(pvalue = new double ))
{
cout << "Error: out of memory." <<endl;
exit(1);
}
The malloc() function from C, still exists in C++, but it is recommended to avoid using
malloc() function. The main advantage of new over malloc() is that new doesn't just allocate
memory, it constructs objects which is prime purpose of C++.

At any point, when you feel a variable that has been dynamically allocated is not anymore
required, you can free up the memory that it occupies in the free store with the delete operator
as follows:
delete pvalue;

// Release memory pointed to by pvalue

Let us put above concepts and form the following example to show how new and delete
work:
#include <iostream>
using namespace std;
int main ()
{
double* pvalue = NULL; // Pointer initialized with null
pvalue = new double; // Request memory for the variable
*pvalue = 29494.99; // Store value at allocated address
cout << "Value of pvalue : " << *pvalue << endl;
delete pvalue;

// free up the memory.

return 0;
}
If we compile and run above code, this would produce the following result:
Value of pvalue : 29495
Dynamic Memory Allocation for Arrays:
Consider you want to allocate memory for an array of characters, i.e., string of 20 characters.
Using the same syntax what we have used above we can allocate memory dynamically as
shown below.
char* pvalue = NULL; // Pointer initialized with null
pvalue = new char[20]; // Request memory for the variable
To remove the array that we have just created the statement would look like this:
delete [] pvalue;

// Delete array pointed to by pvalue

Following the similar generic syntax of new operator, you can allocat for a multi-dimensional
array as follows:
double** pvalue = NULL; // Pointer initialized with null
pvalue = new double [3][4]; // Allocate memory for a 3x4 array
However, the syntax to release the memory for multi-dimensional array will still remain same
as above:
delete [] pvalue;

// Delete array pointed to by pvalue

Dynamic Memory Allocation for Objects:


Objects are no different from simple data types. For example, consider the following code
where we are going to use an array of objects to clarify the concept:
#include <iostream>
using namespace std;
class Box
{
public:
Box() {
cout << "Constructor called!" <<endl;
}
~Box() {
cout << "Destructor called!" <<endl;
}
};
int main( )
{
Box* myBoxArray = new Box[4];
delete [] myBoxArray; // Delete array
return 0;
}
If we were to allocate an array of four Box objects, the Simple constructor would be called
four times and similarly while deleting these objects, destructor will also be called same
number of times.
If we compile and run above code, this would produce the following result:
Constructor called!
Constructor called!
Constructor called!
Constructor called!
Destructor called!
Destructor called!
Destructor called!
Destructor called!

You might also like