Ch06 Objects and Classes
Ch06 Objects and Classes
Ch06 Objects and Classes
Programming
Engr. Rashid Farid Chishti
chishti@iiu.edu.pk
Chapter 06: Objects and Classes
3
The Unified Modeling Language
The Unified Modeling Language (UML) is a graphical
language consisting of many kinds of diagrams.
It helps program analysts figure out what a program
should do, and helps programmers design and
understand how a program works.
The UML is a powerful tool that can make programming
easier and more effective.
We introduce each UML feature where it will help to
clarify the OOP topic being discussed.
In this way you learn the UML painlessly at the same time
the UML helps you to learn C++.
4
Class
A class serves as a plan, or template. It specifies what
data and what functions will be included in objects of
that class.
Defining the class doesn’t create any objects, just as the
type int doesn’t create any variables.
A class is thus a description of a number of similar
objects.
5
A Simple Class (1/2)
#include <iostream>
#include <stdlib.h>
using namespace std;
7
Classes and Objects
An object has the same relationship to a class that a
variable has to a data type.
An object is said to be an instance of a class, in the same
way my Corolla is an instance of a vehicle.
In the program the class , whose name is student, is
defined in the first part of the program.
In main(), we define two objects Ali and Usman that are
instances of that class.
Each of the two objects is given a value, and each displays
its value.
8
Defining the Class
12
Defining the Class
Remember that the definition of the class student
does not create any objects. It only describes how they
will look when they are created.
Defining objects means creating them. This is also called
instantiating them, because an instance of the class is
created. An object is an instance of a class.
ali.set_age(21); This syntax is used to call a
member function that is associated with a specific object
ali.
Member functions of a class can be accessed only by an
object of that class.
13
Using Mobile Phone as an Object (1/2)
// mobile.cpp demonstrates mobile phone as an object
#include <iostream>
#include <stdlib.h>
using namespace std;
class mobile // class name should be the name of a concept
{
private:
string company_name;
string model_number;
string emi_number;
float cost;
public:
void set_info(string cn,string mn, string emi, float price)
{ // set data
company_name = cn;
model_number = mn;
emi_number = emi;
cost = price;
}
14
Using Mobile Phone as an Object (2/2)
void show_info()
{ // display data
cout << "Company = " << company_name.data() << endl;
cout << "Model = " << model_number.data() << endl;
cout << "EMI = " << emi_number.data() << endl;
cout << "Cost = Rs." << cost << endl;
}
};
int main()
{
mobile m1; // define object of class mobile
m1.set_info("QMobile", "Noir A950", "don’t know :)", 25000.0F);
// call member function
m1.show_info();
// call member function
system("PAUSE");
return 0;
}
15
Using Mobile Phone as an Object
If you were designing an inventory program you might
actually want to create a class something like mobile.
It’s an example of a C++ object representing a physical
object in the real world—a mobile phone.
Standard C++ includes a new class called string.
Using string object, you no longer need to worry about
creating an array of the right size to hold string variables.
The string class assumes all the responsibility for memory
management.
16
Using Class to Represent Height (1/2)
#include <iostream>
#include <stdlib.h>
using namespace std;
class Height{ // A Height class
private:
int feet;
float inches;
public:
void set(int ft, float in){
feet = ft; inches = in;
}
void get(){ // get height information from user
cout << "\nEnter Your Height Information "<<endl;
cout << "Enter feet: ";cin >> feet;
cout << "Enter inches: "; cin >> inches;
}
void show(){ // display height information
cout << "Height = "<< feet << " feet and " << inches
<< " inches."<<endl;
}
17
Using Class to Represent Height (2/2)
};
int main()
{
Height H1, H2; // define two height objects
H1.set(4, 9.35F); // set feet = 4 and inches = 9.35 in H1 object
H2.get(); // get feet and inches info from user for H2
18
Constructors
We see that member functions can be used
to give values to the data items in an object.
Sometimes, however, it’s convenient if an object can
initialize itself when it’s first created, without requiring a
separate call to a member function.
Automatic initialization is carried out using a special
member function called a constructor.
A constructor is a member function that is executed
automatically whenever an object is created.
Constructor has the same name of class and it has no
return type.
19
Constructors: House Example (1/2)
// A Constructor Example
#include <iostream>
using namespace std;
class House{
private:
double area; // area in square feet
public:
House() : area(1000){ // a zero (no) argument constructor
cout<< "House Created \n";
}
void set_area(double a)
{ area = a; }
double return_area()
{ return area; }
void get_area(){ // get area info from user
cout << "What is the area of House in Square Feet:";
cin >> area;
}
};
20
Constructors: House Example (2/2)
int main()
{
House H1, H2; // define objects and calls constructor
cout << "default area of House H1 is = "
<< H1.return_area() << endl;
cout << "default area of House H2 is = "
<< H2.return_area() << endl;
H1.set_area(1500);
H2.get_area();
cout << "Now Area of House H1 is = "
<< H1.return_area() << " Square Feet"<<endl;
cout << "Now Area of House H2 is = "
<< H2.return_area() << " Square Feet"<<endl;
system("PAUSE");
return 0;
}
21
Constructors: A Dice Example (1/2)
#include <iostream> // for cin and cout
#include <stdlib.h> // for rand(), srand() and system()
#include <time.h> // for time()
using namespace std;
class Dice{
private:
int number;
public:
Dice():number(1){ // zero (no) argument constructor
// Sets the default number rolled by a dice to 1
// seed random number generator with current system time
srand(time(0));
}
int roll() //Function to roll a dice.
{ // This function uses a random number generator to randomly
// generate a number between 1 and 6, and stores the number
// in the instance variable number and returns the number.
number = rand() % 6 + 1;
return number;
}
22
Constructors: A Dice Example (2/2)
int get_number() // Function to return the number on the top face
{ // of the die. It returns the value of the variable number.
return number;
}
};
int main(){
Dice d1,d2;
cout << "d1: " << d1.get_number() << endl;
cout << "d2: " << d2.get_number() << endl;
cout << "After rolling d1: " << d1.roll() << endl;
cout << "After rolling d2: " << d2.roll() << endl;
cout << "The sum of the numbers rolled by the dice is: "
<< d1.roll() + d2.roll() << endl;
cout << "After rolling again, the sum of the numbers rolled is: "
<< d1.roll() + d2.roll() << endl;
system("PAUSE");
return 0;
}
23
Destructors
You might guess that another function is called
automatically when an object is destroyed. This is indeed
the case. Such a function is called a destructor.
A destructor also has the same name as the class name
but is preceded by a tilde (~) sign:
Like constructors, destructors do not have a return value.
They also take no arguments.
The most common use of destructors is to de-allocate
memory that was allocated for the object by the
constructor.
24
Destructors: House Example
#include <iostream>
using namespace std;
class House{
private: double area; // area in square feet
public:
House() : area(1000) // a zero argument const.
{ cout << "House Created \n"; }
~House() // a zero (no) argument constructor
{ cout << "House has been destroyed \n"; }
double return_area()
{ return area; }
};
int main(){
House H1;
cout << "default area of "
<< "House H1 is = " << H1.return_area() << endl;
system("PAUSE"); return 0;
}
25
Destructors: House Example 2
// A Constructor Example
#include <iostream>
using namespace std;
class House{
private: double area; // area in square feet
public:
House() : area(1000) // a zero (no) argument constructor
{ cout << "House Created \n"; }
~House() // a zero (no) argument constructor
{ cout<< "House has been destroyed \n"; }
};
void Create_House(){
House aHouse;
cout << "End of function" << endl;
}
int main(){
Create_House();
Create_House();
system("PAUSE"); return 0;
}
26
Objects as Function Arguments
Next program demonstrates some new aspects of
classes, which are:
Constructor Overloading
Defining Member Functions Outside The Class
Objects as Function Arguments.
27
Objects as Function Arguments (1/3)
// englcon.cpp constructors, adds objects using member function
#include <iostream>
#include <stdlib.h>
using namespace std;
class Distance // English Distance class
{
private:
int feet; float inches;
public:
Distance() : feet(0), inches(0.0)
{ cout<< "No Arguments Constructor has been Called \n" ; }
29
Objects as Function Arguments (3/3)
int main()
{
Distance dist1, dist3; // Calls no args. constructor
Distance dist2(11, 6.25); // Calls two args. constructor
dist1.getdist(); // get dist1 from user
dist3.add_dist(dist1, dist2); // dist3 = dist1 + dist2
// display all lengths
cout << "\ndist1 = "; dist1.showdist();
cout << "\ndist2 = "; dist2.showdist();
cout << "\ndist3 = "; dist3.showdist();
cout << endl;
system("PAUSE");
return 0;
}
30
Constructors Overloading
Since there are now two explicit constructors with the
same name, Distance(), we say the constructor is
overloaded.
Which of the two constructors is executed when an
object is created depends on how many arguments are
used in the definition:
Distance length;
// calls first constructor
31
Member Functions Defined Outside the Class
34
21
1.75
9 11
7.5 6.25
35
The Default Copy Constructor
We’ve seen two ways to initialize objects.
A no-argument constructor can
initialize data members to constant values
A multi-argument constructor can initialize data members to
values passed as arguments.
You can also initialize one object with another object of
the same type. Surprisingly, you don’t need to create a
special constructor for this; one is already built into all
classes.
It’s called the default copy constructor. It’s a one
argument constructor whose argument is an object of
the same class as the constructor. The next program
shows how this constructor is used. 36
The Default Copy Constructor (1/2)
// ecopycon.cpp initialize objects using default copy constr.
#include <iostream>
#include <stdlib>
using namespace std;
class Distance
{ // English Distance class
private:
int feet; float inches;
public:
Distance() : feet(0), inches(0.0) // constructor (no args)
{ cout<< "No Arguments Constructor has been Called \n" ; }
38
Returning Objects from Functions (1/3)
// englret.cpp function returns value of type Distance
#include <iostream>
#include <stdlib.h>
using namespace std;
class Distance{ // English Distance class
private:
int feet; float inches;
public:
Distance() : feet(0), inches(0.0) // constructor (no args)
{ cout<< "No Arguments Constructor has been Called \n" ; }
};
41
Returning Objects from Functions
To execute the statement dist3 = dist1.add_dist(dist2);
A temporary object of class Distance is created to store
the sum.
The sum is calculated by adding two distances.
The first is the object dist1, of which add_dist() is a member. Its
member data is accessed in the function as feet and
inches.
The second is the object passed as an argument, dist2.
Its member data is accessed as d2.feet and d2.inches.
The result is stored in temp and accessed as temp.feet and
temp.inches.
42
Returning Objects from Functions
The temp object is then returned by the function using
the statement return temp;
The statement in main() assigns it to dist3.
Notice that dist1 is not modified; it simply supplies data to
add_dist().
Figure on next slide shows how this looks.
In the topic, “Operator Overloading”, we’ll see how to use
the arithmetic + operator to achieve the even more
natural expression like dist3 = dist1 + dist2;
43
22
2.25
10 11
8 6.25
44
Structures and Classes
In fact, you can use structures in almost exactly the same
way that you use classes. The only formal difference
between class and struct is that in a class the members
are private by default, while in a structure they are public
by default. You can just as well write
class foo
{
int data1;
public:
void func();
}; //and the data1 will still be private.
45
Structures and Classes
If you want to use a structure to accomplish the same
thing as this class, you can dispense with the keyword
public, provided you put the public members before the
private ones
struct foo{
void func();
private:
int data1;
}; // since public is the default.
However, in most situations programmers don’t use a
struct this way. They use structures to group only data,
and classes to group both data and functions.
46
Classes, Objects and Memory
you might have the impression that each object created
from a class contains separate copies of that class’s data
and member functions.
It’s true that each object has its own separate data items
But all the objects in a given class use the same member
functions.
The member functions are created and placed in memory
only once—when they are defined in the class definition.
Since the functions for each object are identical. The data
items, however, will hold different values.
47
Classes, Objects and Memory
Object 2 Object 3
Object 1
data1
data1 data1
data1 data1
data1
data2
data2 data2
data2 data2
data2
Function1()
Function1()
Function2()
Function2()
48
Static Class Data
If a data item in a class is declared as static, only one such
item is created for the entire class, no matter how many
objects there are.
A static data item is useful when all objects of the same
class must share a common item of information.
A member variable defined as static has characteristics
similar to a normal static variable: It is visible only within
the class, but its lifetime is the entire program. It conti-
nues to exist even if there are no objects of the class.
a normal static variable is used to retain information
between calls to a function, static class member data is
used to share information among the objects of a class.
49
Static Class Data
Why would you want to use static member data? As an
example, suppose an object needed to know how many
other objects of its class were in the program.
In a road-racing game, for example, a race car might want
to know how many other cars are still in the race.
In this case a static variable Total_Cars could be included
as a member of the class. All the objects would have
access to this variable. It would be the same variable for
all of them; they would all see the same number of
Total_Cars.
50
Static Data Class (1/2)
// statdata.cpp demonstrates a simple static data member
#include <iostream>
using namespace std;
class Car
{
private:
static int Total_Cars; // only one data item for all objects
// note: "declaration" only!
public:
Car() // increments count when object created
{ Total_Cars++; }
~Car()
{ Total_Cars--; }
};
int Car::Total_Cars = 0; // *definition* of count
51
Static Data Class (2/2)
int main()
{
Car Toyota, Honda, Suzuki; // create three objects
cout << Toyota.How_Many() << " Cars are in Race" << endl;
cout << Honda.How_Many() << " Cars are in Race" << endl;
// each object sees the same data
cout << Suzuki.How_Many() << " Cars are in Race" << endl;
cout << Suzuki.How_Many() << " Cars are in Race" << endl;
cout << Pajero->How_Many() << " Cars are in Race" << endl;
delete Pajero;
cout << Honda.How_Many() << " Cars are in Race" << endl;
return 0;
}
52
Static Class Data
Ordinary variables are usually declared (the compiler is
told about their name and type) and defined (the
compiler sets aside memory to hold the variable) in the
same statement. e.g. int a;
Static member data, on the other hand, requires two
separate statements.
The variable’s declaration appears in the class definition,
but the variable is actually defined outside the class, in much
the same way as a global variable.
If static member data were defined inside the class, it
would violate the idea that a class definition is only a
blueprint and does not set aside any memory.
53
const Member Function
A const member function guarantees that it will never
modify any of its class’s member data.
//constfu.cpp demonstrates const member functions
class aClass
{
private:
int alpha;
public:
void nonFunc() // non-const member function
{
alpha = 99; // OK
}
57
const Member Function Arguments
if an argument is passed to an ordinary function by
reference, and you don’t want the function to modify it,
the argument should be made const in the function
declaration (and definition). This is true of member
functions as well.
Distance Distance::add_dist(const Distance& d2) const{
In above line, argument to add_dist() is passed by
reference, and we want to make sure that won’t modify
this variable, which is dist2 in main().
Therefore we make the argument d2 to add_dist() const
in both declaration and definition.
58
const Objects
In several example programs, we’ve seen that we can
apply const to variables of basic types such as int to keep
them from being modified.
In a similar way, we can apply const to objects of classes.
When an object is declared as const, you can’t modify it.
It follows that you can use only const member functions
with it, because they’re the only ones that guarantee not
to modify it. e.g. A football field (for American-style
football) is exactly 300 feet long. If we were to use the
length of a football field in a program, it would make
sense to make it const, because changing it would
represent the end of the world for football fans.
59
const Objects (1/2)
// constObj.cpp constant Distance objects
#include <iostream>
using namespace std;
class Distance // English Distance class
{
private:
int feet;
float inches;
public:
// 2-arg constructor
Distance(int ft, float in) : feet(ft), inches(in)
{ }
60
const Objects (2/2)
void showdist() const // display distance; const function
{
cout << feet << "\'-" << inches << '\"';
}
};
int main()
{
const Distance football(300, 0);
61
Assignment Question No.1
Implement a Circle class. Each object of this class will
represent a circle, storing its radius and the x and y
coordinates of its center as floats.
One constructor should initialize it data to 0, and another
constructor should initialize it to fixed values given by user.
Make void setValues(float, float, float) functions to set x,y
and radius.
Make float area() function, and a float circumference()
function to return area and circumference.
Make void print() function to display xy coordinates and
radius of a circle.
Call these functions in main() to display their working.
62
Assignment Question No.2
Create a class Rectangle with attributes length and width,
each of which defaults to 1.
Provide member functions that calculate the perimeter and
the area of the rectangle.
Also, provide void set(int I ,int W) and void get() functions
for the length and width attributes.
The set functions should verify that length and width are
each floating-point numbers larger than 0.0 and less than
20.0.
Make a Draw function that makes a rectangle using a
character * on console.
63
Assignment Question No.3
Create a class called time
that has separate int member data for hours, minutes, and
seconds.
One constructor should initialize this data to 0, and another
constructor should initialize it to fixed values.
Make void print() to display time in 23:59:59 format.
Make void setHour( int ) to set hours.
Make void setminute (int ) to set minutes.
Make void setSecond( int ) to set seconds.
Make void setTime( int, int, int ) to set hour, minute, second
Make int getHour(); int getMinute(); int getSecond();
to return hours, minute and seconds respectively.
64
Assignment Question No.3
include a tick member function that increments the
time stored in a Time object by one second.
An add member function should add two objects of
type time passed as arguments.
Be sure to test the following cases:
1. Incrementing into the next minute.
2. Incrementing into the next hour.
3. Incrementing into the next day (i.e., 23:59:59 to 00:00:00).
Make 1000 times loop in a main function. Call tick and
printTime functions in that loop for an object. Also make two
objects and add them to a third object and print their values.
65
Assignment Question No.4
Create a class called Rational for performing arithmetic with
fractions. Write a program to test your class.
Use integer variables to represent the private data of
the class the numerator and the denominator.
Provide a constructor that enables an object of this class
to be initialized when it is declared. The constructor
should contain default values in case no initializers are
provided and should store the fraction in reduced form.
For example, the fraction 2/4 would be stored in the
object as 1 in the numerator and 2 in the denominator.
Provide public member functions that perform each of
the following tasks:
66
Assignment Question No.4
1. Adding two Rational numbers.
The result should be stored in reduced form.
2. Subtracting two Rational numbers.
The result should be stored in reduced form.
3. Multiplying two Rational numbers.
The result should be stored in reduced form.
4. Dividing two Rational numbers.
The result should be stored in reduced form.
5. Printing Rational numbers in the form a/b, where a is
the numerator and b is the denominator.
6. Printing Rational numbers in floating-point format.
67
Assignment Question No.5
The equation of a line in standard form is ax + by = c, where both a
and b cannot be zero, and a, b, and c are real numbers.
If b is not equal to zero, then –a/b is the slope of the line.
Two lines are parallel if they have the same slope or both are
vertical lines.
Two lines are perpendicular if either one of the lines is horizontal
68
Assignment Question No.5
Your class must contain the following operations.
If a line is nonvertical, then determine its slope.
Determine if two lines are equal. Two lines a1x + b1y = c1 and a2x
+b2y = c2 are equal if
either a1 = a2, b1 = b2, and c1= c2
or a1 = ka2, b1= kb2, and c1 = kc2 for some real number k.)
69
Assignment Question No.6
Create a class TicTacToe to play the game of tic-tac-toe
The class contains as private data a 3-by-3 two-
dimensional array of integers.
The constructor should initialize the empty board to all
zeros.
Allow two human players.
place a 1 in the specified square, wherever the first player moves, .
Place a 2 wherever the second player moves.
Each move must be to an empty square containing 0.
After each move, determine whether the game has been
won or is a draw.
70