Lab 01
Lab 01
Lab 01
CS 201-Data Structures
Lab Session 01
OOP CONCEPTS IN C++
Classes and Objects:
A class is an expanded concept of a data structure: instead of holding only data, it
can hold both data and functions.
An object is an instantiation of a class. In terms of variables, a class would be the
type, and an object would be the variable.
Classes are generally declared using the keyword class, with the following format:
class Box
{
public:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
Box Box1; // Declare Box1 of type Box
Box Box2; // Declare Box2 of type Box
Access modifiers/ specifiers:
An access specifier is one of the following three keywords: private, public or
protected. These specifiers modify the access rights that the members following
them acquire:
A public member is accessible from anywhere outside the class but within a
program. You can set and get the value of public variables without any
member function
A private member variable or function cannot be accessed, or even viewed
from outside the class. Only the class and friend functions can access
private members.
A protected member variable or function is very similar to a private
member but it provided one additional benefit that they can be accessed in
child classes which are called derived classes.
The Class Constructor:
A class constructor is a special member function of a class that is executed
whenever we create new objects of that class.A constructor will have exact same
name as the class and it does not have any return type at all, not even void.
Constructors can be very useful for setting initial values for certain member
variables.
Following example explain the concept of constructor:
class Line
{
public:
void setLength( double len );
double getLength( void );
Line(); // This is the constructor
private:
double length;
};
// Member functions definitions including constructor
Line::Line(void)
{
cout << "Object is being created" << endl;
}
void Line::setLength( double len )
{
length = len;
}
double Line::getLength( void )
{
return length;
}
// Main function for the program
int main( )
{
Line line;
// set line length
line.setLength(6.0);
cout << "Length of line : " << line.getLength() <<endl;
return 0;
}
Output:
Object is being created
Length of line : 6
Default constructor
If you do not declare any constructors in a class definition, the compiler assumes
the class to have a default constructor with no arguments. Therefore, after
declaring a class like this one:
class CExample {
public:
int a,b,c;
void multiply (int n, int m) { a=n; b=m; c=a*b; }
};
The compiler assumes that CExample has a default constructor, so you can
declare objects of this class by simply declaring them without any arguments:
CExample ex;
But as soon as you declare your own constructor for a class, the compiler no
longer provides an implicit default constructor. So you have to declare all objects
of that class according to the constructor prototypes you defined for the class:
OOP Concepts:
Encapsulation
Inheritance
Polymorphism
Encapsulation
All C++ programs are composed of following two fundamental elements:
Program statements (code): This is the part of a program that performs
actions and they are called functions.
Program data: The data is the information of the program which affected
by the program functions.
Encapsulation is an Object Oriented Programming concept that binds together the
data and functions that manipulate the data, and that keeps both safe from
outside interference and misuse. Data encapsulation led to the important OOP
concept of data hiding.
Data encapsulation is a mechanism of bundling the data, and the functions that
use them and data abstraction is a mechanism of exposing only the interfaces
and hiding the implementation details from the user.
C++ supports the properties of encapsulation and data hiding through the
creation of user-defined types, called classes. We already have studied that a
class can contain private, protected and public members.
class Box
{
public:
double getVolume(void)
{
return length * breadth * height;
}
private:
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
};
The variables length, breadth, and height are private. This means that they can be
accessed only by other members of the Box class, and not by any other part of
your program. This is one way encapsulation is achieved.
Inheritance:
Inheritance allows us to define a class in terms of another class, which makes it
easier to create and maintain an application. This also provides an opportunity to
reuse the code functionality and fast implementation time.
Base & Derived Classes:
A class can be derived from more than one classes, which means it can inherit
data and functions from multiple base classes. To define a derived class, we use a
class derivation list to specify the base class(es). A class derivation list names one
or more base classes and has the form:
class derived-class: access-specifier base-class
Where access-specifier is one of public, protected, or private, and base-class is
the name of a previously defined class. If the access-specifier is not used, then it is
private by default.
Consider a base class Shape and its derived class Rectangle as follows:
// Base class
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// Derived class
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
Rect.setWidth(5);
Rect.setHeight(7);
// Print the area of the object.
cout << "Total area: " << Rect.getArea() << endl;
return 0;
}
Output:
Total area: 35
Multiple inheritance
In C++ it is perfectly possible that a class inherits members from more than one
class. This is done by simply separating the different base classes with commas in
the derived class declaration.
class CRectangle: public CPolygon, public COutput;
class CTriangle: public CPolygon, public COutput;
Function Overloading :
An overloaded declaration is a declaration that had been declared with the same
name as a previously declared declaration in the same scope, except that both
declarations have different arguments and obviously different definition
(implementation).
The definition of the function must differ from each other by the types and/or the
number of arguments in the argument list. You cannot overload function
declarations that differ only by return type.
The compiler determines the most appropriate definition to use by comparing the
argument types you used to call the function or operator with the parameter
types specified in the definitions. The process of selecting the most appropriate
overloaded function or operator is called overload resolution.
class printData
{
public:
void print(int i) {
cout << "Printing int: " << i << endl;
}
void print(double f) {
cout << "Printing float: " << f << endl;
}
void print(char* c) {
cout << "Printing character: " << c << endl;
}
};
int main(void)
{
printData pd;
// Call print to print integer
pd.print(5);
// Call print to print float
pd.print(500.263);
// Call print to print character
pd.print("Hello C++");
return 0;
}
When the above code is compiled and executed, it produces following result:
Printing int: 5
Printing float: 500.263
Printing character: Hello C++
Overloading Constructors
Like any other function, a constructor can also be overloaded with more than one
function that have the same name but different types or number of parameters.
Remember that for overloaded functions the compiler will call the one whose
parameters match the arguments used in the function call. In the case of
constructors, which are automatically called when an object is created, the one
executed is the one that matches the arguments passed on the object
declaration:
class CRectangle {
int width, height;
public:
CRectangle ();
CRectangle (int,int);
int area (void) {return (width*height);}
};
CRectangle::CRectangle () {
width = 5;
height = 5;
}
CRectangle::CRectangle (int a, int b) {
width = a;
height = b;
}
int main ()
{
CRectangle rect (3,4);
CRectangle rectb;
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
Output:
rect area: 12
rectb area: 25
Polymorphism:
The word polymorphism means having many forms. Typically, polymorphism
occurs when there is a hierarchy of classes and they are related by inheritance.
Polymorphism is achieved by creating virtual function.
A virtual function is a function in a base class that is declared using the keyword
virtual. Defining in a base class a virtual function, with another version in a
derived class, signals to the compiler that we don't want static linkage for this
function.
What we do want is the selection of the function to be called at any given point in
the program to be based on the kind of object for which it is called. This sort of
operation is referred to as dynamic linkage, or late binding.
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
virtual int area()
{
cout << "Parent class area :" <<endl;
return 0;
}
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0)
{
Shape(a, b);
}
int area ()
{
cout << "Rectangle class area :" <<endl;
return (width * height / 2);
}
};
// Main function for the program
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);
// store the address of Rectangle
shape = &rec;
// call rectangle area.
shape->area();
// store the address of Triangle
shape = &tri;
// call triangle area.
shape->area();
return 0;
}
Output:
Rectangle class area
Triangle class area
Exercise:
Create an Employee base class. All employees must have the following private
attributes:
ID
Name
Address
Salary
Employee object must be created with its ID. There should be following function
member in that class:
SetPersonalInfo()
GetPersonalInfo ()
GetSalary()
Create a subclass Manager inherited from Employee base class. Any employee
who is also a manager must have ManagerID.
GetSalary() function in Employee class must be overridden in Manager class. All
managers will get basic salary plus some other allowances.
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________
___________________________________________________________________