Chapter 3 - Object Oriented Programming
Chapter 3 - Object Oriented Programming
(Object-Oriented Programming)
(CS 319)
ClassName objectName;
void main()
{
Circle C1;
//C1.radius = 10; can’t access private member outside the class
cout<<“Area of circle = “<<C1.getArea( );
}
Constructors
A constructor in a class is a special function used to create an
object. Constructor has exactly the same name as the defining
class
void main( )
{
Circle C1;
//C1.radius = 10; can’t access private member outside the class
cout<<“Area of circle = “<<C1.getArea();
}
Access Modifiers
• Access modifiers are used to set access levels for
classes, variables, methods, and constructors
• private, public, and protected
• In C++, default accessibility is private
Data Hiding - Data Field Encapsulation
• A key feature of OOP is data hiding
– data is concealed within a class so that it cannot be
accessed mistakenly by functions outside the class.
void main()
{
Circle C1;
//C1.radius = 10; can’t access private member outside the class
cout<<“Area of circle = “<<C1.getArea();
}
A Simple Program – Default Constructor
class Circle
{ C1 Object Instance
private:
double radius;
public:
//Default Constructor : C1
Circle()
//
{ No Constructor
} Here
radius: Any Value
double getArea()
{ return radius * radius * 3.14159; }
};
Allocate memory
for radius
void main()
{
Circle C1;
//C1.radius = 10; can’t access private member outside the class
cout<<“Area of circle = “<<C1.getArea();
}
Object Construction with Arguments
ClassName objectName(arguments);
Circle circle1(5.5);
A Simple Program – Constructor with Arguments
class Circle
{ C1 Object Instance
private:
double radius;
public: : C1
Circle(double rad)
{ radius = rad; } radius: 9.0
double getArea()
{ return radius * radius * 3.14159; }
Allocate memory
}; for radius
void main()
{
Circle C1(9.0);
//C1.radius = 10; can’t access private member outside the class
cout<<“Area of circle = “<<C1.getArea();
}
Output of the following Program?
class Circle
{
private:
double radius;
public:
Circle(double rad)
{ radius = rad; }
double getArea()
{ return radius * radius * 3.14159; }
};
void main()
{
Circle C1;
cout<<“Area of circle = “<<C1.getArea();
}
Constructor Overloading
class Circle
{
private:
double radius;
public:
Circle ()
{ radius = 1; }
Circle(double rad)
{ radius = rad; }
double getArea()
{ return radius * radius * 3.14159; }
};
void main()
{
Circle C2(8.0);
Circle C1;
cout<<“Area of circle = “<<C1.getArea();
}
The this Pointer
this keyword is a special built-in pointer that references
to the calling object.
void main()
{
Circle C1(99.0);
cout<<“Area of circle = “<<C1.getArea();
}
The this Pointer
class Circle
{
private:
double radius;
public:
Circle(double radius)
{ this->radius = radius; }
double getArea()
{ return radius * radius * 3.14159; }
};
void main()
{
Circle C1(99.0);
cout<<“Area of circle = “<<C1.getArea();
}
Other use of this Pointer
class Circle
{
private:
double radius;
public:
Circle(double radius)
{ this->radius = radius; }
double getArea( )
{ return this->radius * this->radius * 3.14159; }
};
void main()
{
Circle C1(99.0);
cout<<“Area of circle = “<<C1.getArea();
}
Member Functions
Separating Declaration from Implementation
• C++ allows to separate class declaration from
implementation
double radius; ra d iu s : 5 .0
Allocate memory
public: for radius
}; Allocate memory
for radius
void main()
{
Circle c1;
Circle *c2 = new Circle();
cout<<“Area of circle = “<<c1.getArea()<<c2->getArea();
}
Destructors
• A destructor is a member function with the same
name as its class prefixed by a ~ (tilde).
public:
int feet;
Distance():feet(0)
{ } void main()
Distance(int ft): feet(ft) {
{ } Distance dist1, dist3;
Distance addDist(Distance d) Distance dist2(11);
{ dist3 = dist1.addDist(dist2);
dist1.showDistance();
Distance temp;
dist2.showDistance();
temp.feet = this->feet + d.feet; dist3.showDistance();
return temp; }
}
void showDistance()
{ cout<<“Feet = “<<feet; }
};
Accessing Object Members via Pointers
Circle circle1;
Circle *pCircle = &circle1;
cout << "The radius is " << (*pCircle).radius << endl;
cout << "The area is " << (*pCircle).getArea( ) << endl;
pCircle->radius = 5.5;
cout << "The radius is " << pCircle->radius << endl;
cout << "The area is " << pCircle->getArea( ) << endl;
Passing Objects to Functions
Three ways
1. Pass objects by value
2. Pass objects by reference
3. Pass objects by reference via pointers
Pass by value
class Circle {
private:
double radius;
public: void main()
Circle(); {
Circle(double); Circle myCircle;
double getArea(); printCircle(myCircle);
}; }
Circle::Circle()
{ radius = 1.0;}
double Circle::getArea()
{ return radius * radius * 3.14; }
void printCircle(Circle c)
{ cout<<“the area = “<<c.getArea(); }
Pass by reference
class Circle {
private:
void main()
double radius;
{
public:
Circle myCircle;
Circle();
printCircle(myCircle);
Circle(double);
}
double getArea();
};
Circle::Circle()
{ radius = 1.0;}
double Circle::getArea()
{ return radius * radius * 3.14; }
void printCircle(Circle &c)
{ cout<<“the area = “<<c.getArea(); }
Pass by Reference via pointer
class Circle {
private:
double radius; void main()
public: {
Circle(); Circle myCircle;
Circle(double); printCircle(&myCircle);
double getArea(); }
};
Circle::Circle()
{ radius = 1.0;}
double Circle::getArea()
{ return radius * radius * 3.14; }
void printCircle(Circle *c)
{ cout<<“the area = “<<c->getArea(); }
Copy Constructors
• Each class may define several overloaded constructors and one
destructor.
• Additionally, every class has a copy constructor. The signature
of the copy constructor is:
ClassName (ClassName &)
For example, the copy constructor for the Circle class is
Circle(Circle &)
• The copy constructor can be used to create an object
initialized with another object’s data.
Shallow Copy vs. Deep Copy
void show()
{
cout<<"i = "<<i<<endl;
cout<<"p = "<<*p<<endl;
}
};
Shallow Copy - Example
class Test{ void main()
private: {
int i; Test t1(1,12);
int *p; Test t2(t1);
public:
Test(int x, int y){ t1.setVal(0,70);
i = x;
p = new int(y); t1.show();
} t2.show();
}
Test(Test &t) {
i = t.i;
p = t.p;
}
void setVal(int x, int y)
{ i = x; *p = y; }
void show() {
cout<<"i = "<<i<<endl;
cout<<"p = "<<*p<<endl;
}
};
Deep Copy - Example
class Test{ void main()
private: {
int i; Test t1(5,1);
int *p; Test t2(t1);
public:
Test(int x, int y){ t1.setVal(90,3);
i = x;
p = new int(y); t1.show();
} t2.show();
}
Test(Test &t) {
i = t.i;
p = new int(*t.p);
}
void setVal(int x, int y)
{ i = x; *p = y; }
void show() {
cout<<"i = "<<i<<endl;
cout<<"p = "<<*p<<endl;
}
};
Deep Copy - Example
class Test{ void main()
private: {
int i; int *p; Test t1(5,1);
public: Test t2(t1);
Test(int x, int y){
i = x; p = new int(y); t1.setVal(90,3);
}
Test(Test &t) t1.show();
{ i = t.i; t2.show();
p = new int(*t.p); }
}
void setVal(int x, int y)
{ i = x; *p = y; }
void show() {
cout<<"i = "<<i<<endl;
cout<<"p = "<<*p<<endl;
}
~Test()
{ delete p;
cout<<“ pointer deleted”;
}
};
Instance and Static Members
instantiate Memory
circle1
radius = 1 1 radius
Circle numberOfObjects = 2
-radius: double
-numberOfObjects: int
2 Number of Objects
+getNumberOfObjects(): int
instantiate
+getArea(): double circle2
radius = 5 radius
5
numberOfObjects = 2
UML Notation:
+: public variables or functions
-: private variables or functions
underline: static variables or functions
Example – Non-Static data members
void show()
{ cout<<count<<endl; }
};
int Test::count = 0;
Example – Static data members
class Test{ void main()
private: {
static int count; Test t1, t2, t3;
Static function of a class in C++t1.IncrementCounter();
public: cannot access non-
Test()variables, but, it can access
static t2.IncrementCounter();
static variable
{
only. However, non-static member t3.IncrementCounter();
function can
access// static
count and
= 0; non-static variable both.
} Test::show();
void IncrementCounter() Test::show();
{ count++; } Test::show();
}
static void show()
{ cout<<count<<endl; }
};
int Test::count = 0;
Invoking Static Member Function - Syntax
DerivedClass(parameterList): BaseClass()
{ // Perform initialization }
DerivedClass(parameterList): BaseClass(argumentList)
{ // Perform initialization }
No-Arg Constructor in Base Class
A constructor in a derived class must always invoke a constructor in
its base class. If a base constructor is not invoked explicitly, the base
class’s no-arg constructor is invoked by default. For example,
class A
{
};
class B
{
};
};
Types of Inheritance