Oops With C++ PPT Complete PDF
Oops With C++ PPT Complete PDF
About
About the
the Lecturer
Lecturer
BSc
İTÜ, Computer Engineering Department, 1995
MSc
İTÜ, Computer Engineering Department, 1997
Areas of Interest
¾ Digital Image and Video Analysis and Processing
¾ Real-Time Computer Vision Systems
¾ Multimedia: Indexing and Retrieval
¾ Software Engineering
¾ OO Analysis and Design
2
NotesHub.co.in | Download Android App
Welcome
Welcome to
to the
the Course
Course
Important Course Information
¾ Course Hours
• 10:00-13:00 Thursday
¾ Course Web Page
• http://www.cs.itu.edu.tr/~kurt/courses/blg252e
¾ Join to the group
• http://groups.yahoo.com/group/blg252e
• blg252e@yahoogroups.com
¾ E-mail
3
NotesHub.co.in | Download Android App
Grading
Grading Scheme
Scheme
¾ 3 Homeworks (5% each)
¾ 2 Midterm Exams (20%,25%)
¾ A final exam (40%)
¾ You must follow the official Homework Guidelines
(http://www.ce.itu.edu.tr/lisans/kilavuz.html).
¾ Academic dishonesty including but not limited to cheating,
plagiarism, collaboration is unacceptable and subject to disciplinary
actions. Any student found guilty will have grade F. Assignments
are due in class on the due date. Late assignments will generally not
be accepted. Any exception must be approved. Approved late
assignments are subject to a grade penalty.
4
NotesHub.co.in | Download Android App
References
References
5
NotesHub.co.in | Download Android App
Purpose
Purpose of
of the
the Course
Course
► To introduce several programming paradigms including Object-
Oriented Programming, Generic Programming, Design
Patterns
► To show how to use these programming schemes with the C++
programming language to build “good” programs.
Course
Course Outline
Outline
1. Introduction to Object Oriented Programming.
2. C++: A Better C.
3. Classes and Objects
4. Constructors and Destructors
5. Operator Overloading
6. Inheritance
7. Pointers to Objects
8. Polymorphism
9. Exceptions
Course
Course Outline
Outline
10. Templates
11.The Standard Template Library - STL
How
How to
to Use
Use the
the Icons
Icons
Demonstration Discussion
Reference
Exercise
1 INTRODUCTION
11
NotesHub.co.in | Download Android App
Content
Content
►Introduction to Software Engineering
►Object-Oriented Programming Paradigm
Introduction 1
Software
Software
► Computer Software is the product that software engineers
design and build.
► It encompasses
Introduction 1
History
History
► Common problems:
– Why does it take so long?
– Why are development costs so high?
Introduction 1
History
History
► Software Engineering: 1967, NATO Study Group,
Garmisch/GERMANY
► 1968, NATO Software Engineering Conference:
Introduction 1
Software Crisis
– Low quality
– Not met deadlines and cost limits
After
After 35
35 years
years
► Still softwares are
– Late
– Over budget
Introduction 1
Is
Is SW
SW An
An Engineering?
Engineering?
► May be?
► Bridge – Operating System
– After collapse, redesign & rebuild
Introduction 1
McCall
McCall Quality
Quality Triangle
Triangle
Maintainability Portability
Flexibility
Introduction 1
Reusability
Testability Interoperability
P R O D U C T R E V IS I O N PRODUCT TRANSITION
PRODUCT OPERATION
Correctness Usability Efficiency
Reliability Integrity
Operation
Introduction 1
Revision
Transition
McCall
McCall Quality
Quality Triangle
Triangle
►Correctness: The extent to which a program satisfies its
specification and fulfills the customer’s mission objectives
►Reliability: The extent to which a program can be expected to
perform its intended function with required precision
Introduction 1
McCall
McCall Quality
Quality Triangle
Triangle
►Flexibility: Effort required to modify an operational program
►Testability: Effort required to test a program to ensure that it
performs its intended function
Introduction 1
Customer-User-Developer
Customer-User-Developer
Introduction 1
Development
Development Team
Team
Introduction 1
Software
Software Life
Life Cycle
Cycle
►Requirements Phase
►Specification Phase
Introduction 1
►Design Phase
►Implementation Phase
►Integration Phase
►Maintenance Phase
►Retirement Phase
Requirements
Requirements Phase
Phase
►Defining constraints
– Functions
– Due dates
Introduction 1
– Costs
– Reliability
– Size
►Types
– Functional
– Non-Functional
Object Oriented Programming 25
NotesHub.co.in | Download Android App
Specification
Specification Phase
Phase
►Documentation of requirements
– Inputs & Outputs
Introduction 1
– Formal
– Understandable for user & developer
– Usually functional requirements. (what to do)
– Base for testing & maintenance
►The contract between customer & developer ?
Design
Design Phase
Phase
►Defining Internal structure (how to do)
►Has some levels (or types of docs)
– Architectural design
Introduction 1
– Detailed design
– ...
►Important
– To backtrack the aims of decisions
– To easily maintain
Implementation
Implementation Phase
Phase
►Simply coding
►Unit tests
Introduction 1
– For verification
Integration
Integration Phase
Phase
►Combining modules
►System tests
Introduction 1
– For validation
►Quality tests
Maintenance
Maintenance Phase
Phase
►Corrective
►Enhancement
Introduction 1
– Perfective
– Adaptive
►Usually maintainers are not the same people with
developers.
►The only input is (in general) the source code of the
software?!?
Retirement
Retirement Phase
Phase
►When the cost of maintenance is not effective.
– Changes are so drastic, that the software should be
redesigned.
Introduction 1
Why
Why Object
Object Technology?
Technology?
►Expectations are,
►Reducing the effort, complexity, and cost of development
and maintenance of software systems.
Introduction 1
Why
Why C++
C++
► C++ supports writing high quality programs (supports OO)
► C++ is used by hundreds of thousands of programmers in every
application domain.
Introduction 1
What
What is
is Programming?
Programming?
►Like any human language, a programming language
provides a way to express concepts.
►Program development involves creating models of real
Introduction 1
What
What is
is Programming?
Programming? (Con’t)
(Con’t)
Programming Language
class {
Introduction 1
Abstraction/
Object
Modeling Implementation
Object Object
COMPUTER
REAL WORLD PROGRAMMER
► If successful, this medium of expression (the object-oriented way)
will be significantly easier, more flexible, and efficient than the
alternatives as problems grow larger and more complex.
Object Oriented Programming 35
NotesHub.co.in | Download Android App
Learning
Learning C++
C++
► Like human languages, programming languages also have many syntax
and grammar rules.
► Knowledge about grammar rules of a programming language is not
enough to write “good” programs.
Introduction 1
Software
Software Quality
Quality Metrics
Metrics
• A program must do its job correctly. It must be useful and usable.
• A program must perform as fast as necessary (Real-time constraints).
• A program must not waste system resources (processor time, memory, disk capacity,
network capacity) too much.
• It must be reliable.
• It must be easy to update the program.
• A good software must have sufficient documentation (users manual). user
• Source code must be readable and understandable.
• It must be easy to maintain and update (change) the program.
• A program must consist of independent modules, with limited interaction.
• An error may not affect other parts of a program (Locality of errors).
• Modules of the program must be reusable in further projects.
• A software project must be finished before its deadline.
• A good software must have sufficient documentation (about development).
Software developer
Object-oriented programming technique enables programmers to build high-
quality programs. While designing and coding a program, these quality metrics
must be kept always in mind. 37
NotesHub.co.in | Download Android App
Software
Software Development
Development Process
Process
Task/Problem
Analysis/Planning
Introduction 1
OO
Design/Modeling
Documentation
Implementation
C++
Test Product
UML
UML
►They are important design principles and design
patterns, which help us developing high-quality software.
The Unified Modeling Language (UML) is useful to
Introduction 1
Unified
Unified Process
Process (UP)
(UP)
►The UP promotes several best practices.
► Iterative
► Incremental
Introduction 1
► Risk-driven
Unified
Unified Process
Process (UP)
(UP)
Procedural
Procedural Programming
Programming
►Pascal, C, BASIC, Fortran, and similar traditional
programming languages are procedural languages. That is,
each statement in the language tells the computer to do
Introduction 1
something.
► In a procedural language, the emphasis is on doing things
(functions).
►A program is divided into functions and—ideally, at least—
each function has a clearly defined purpose and a clearly
defined interface to the other functions in the program.
Procedural
Procedural Programming
Programming
Global Data
Problems
Problems with
with Procedural
Procedural Programming
Programming
► Data Is Undervalued
► Data is, after all, the reason for a program’s existence. The important
parts of a program about a school for example, are not functions that
Introduction 1
display the data or functions that checks for correct input; they are
student, teacher data.
► Procedural programs (functions and data structures) don’t model the
real world very well. The real world does not consist of functions.
► Global data can be corrupted by functions that have no business
changing it.
► To add new data items, all the functions that access the data must be
modified so that they can also access these new items.
► Creating new data types is difficult.
Besides...
Besides...
►It is also possible to write good programs by using
procedural programming (C programs).
►But object-oriented programming offers programmers
Introduction 1
Object
Object Oriented
Oriented Programming
Programming
The fundamental idea behind object-oriented programming is:
• The real world consists of objects. Computer programs may
contain computer world representations of the things (objects) that
Introduction 1
Object
Object Oriented
Oriented Programming
Programming
►What kinds of things become objects in object-oriented
programs?
– Human entities: Employees, customers, salespeople,
Introduction 1
worker, manager
– Graphics program: Point, line, square, circle, ...
– Mathematics: Complex numbers, matrix
– Computer user environment: Windows, menus, buttons
– Data-storage constructs: Customized arrays, stacks,
linked lists
OOP
OOP :: Encapsulation
Encapsulation and
and Data
Data Hiding
Hiding
Thinking in terms of objects rather than functions has a helpful
effect on design process of programs. This results from the close
match between objects in the programming sense and objects in the
Introduction 1
real world.
To create software models of real world objects both data and the
functions that operate on that data are combined into a single
program entity. Data represent the properties (state), and functions
represent the behavior of an object. Data and its functions are said
to be encapsulated into a single entity.
OOP
OOP :: Encapsulation
Encapsulation and
and Data
Data Hiding
Hiding Con’t
►Encapsulation and data hiding are key terms in the
description of object-oriented languages.
►If you want to modify the data in an object, you know
Introduction 1
Example:
Example: A
A Point
Point on
on the
the plane
plane
A Point on a plane has two properties; x-y coordinates.
Abilities (behavior) of a Point are, moving on the plane,
appearing on the screen and disappearing.
Introduction 1
Example:
Example: A
A Point
Point on
on the
the plane
plane Con’t
Once the model has been built and tested, it is possible to
create many objects of this model , in main program.
Introduction 1
The
The Object
Object Model
Model
Introduction 1
The
The Object
Object Model
Model Con’t
Introduction 1
OOP
OOP vs.
vs. Procedural
Procedural Programming
Programming
Procedural Programming:
Example:
Example: Procedural
Procedural Programming
Programming Con’t
►Real world thing: student
►Computer model: char *, int, float ...
►It is said that the C language is closer to the computer than
Introduction 1
the problem.
OOP
OOP vs.
vs. Procedural
Procedural Programming
Programming Con’t
Object Oriented Programming
►The object-oriented approach provides tools for the
programmer to represent elements in the problem space.
Introduction 1
OOP
OOP vs.
vs. Procedural
Procedural Programming
Programming Con’t
►Benefits of the object-oriented programming:
– Readability
– Understandability
Introduction 1
2 C++ As a Better C
59
NotesHub.co.in | Download Android App
C++
C++ As
As aa Better
Better C
C
► C++ was developed from the C programming
language, by adding some features to it. These
features can be collected in three groups:
2
Non object-oriented
extensions
involved with the programming technique.
Object-oriented extensions
2. Features which support object-oriented Generic programming
programming. extensions
Minor exceptions:
C code that is not C++
Object Oriented Programming 60
NotesHub.co.in | Download Android App
C++'s
C++'s Enhancements
Enhancements to
to CC (Non
(Non Object-Oriented)
Object-Oriented)
C++'s
C++'s Enhancements
Enhancements to
to C
C (Non-OO)
(Non-OO)
►Comment Lines
►/* This is a comment */
2
C++ As a Better C
Declarations
Declarations and
and Definitions
Definitions in
in C++
C++
►Remember; there is a difference between a declaration
and a definition
2
Example
Example
extern int i; // Declaration
int i; // Definition
struct ComplexT{ // Declaration
2
float re,im;
};
C++ As a Better C
C++'s
C++'s Enhancements
Enhancements to
to C
C (Non-OO)
(Non-OO)
int a=0;
for (int i=0; i < 100; i++){ // i is declared in for loop
2
a++;
C++ As a Better C
C++'s
C++'s Enhancements
Enhancements to
to C
C (Non-OO)
(Non-OO)
► Scope Operator ::
A definition in a block can hide a definition in an enclosing
2
int x=1; 2
2
void f(){
C++ As a Better C
1
int x=2; // Local x
::x++; // Global x is 2
}
int i=1;
main(){
int i=2;
{
2
int n=i ;
int i = 3 ;
C++ As a Better C
inline
inline functions
functions
► In C, macros are defined by using the #define directive of the
preprocessor.
2
function.
► Remember the difference between normal functions and
macros:
► A normal function is placed in a separate section of code and a
call to the function generates a jump to this section of code.
► Before the jump the return address and arguments are saved in
memory (usually in stack).
Object Oriented Programming 69
NotesHub.co.in | Download Android App
inline
inline functions
functions Con’t
► When the function has finished executing, return address and return
value are taken from memory and control jumps back from the end
of the function to the statement following the function call.
2
► The advantage of this approach is that the same code can be called
C++ As a Better C
inline
inline functions
functions Con’t
#define sq(x) (x*x)
inline int SQ(int x){return (x*x); }
#define max(x,y) (y<x ? x : y)
2
inline
inline functions
functions Con’t
► The decision to inline a function must be made with some
care.
2
inline
inline functions
functions Con’t
► Advantages
► Debugging
2
► Type checking
C++ As a Better C
► Readable
Default
Default Function
Function Arguments
Arguments
►A programmer can give default values to parameters of
a function. In calling of the function, if the arguments
2
Example
Example
► In calling a function argument must be given from left
to right without skipping any parameter
2
Example
Example
void n(int i=1, int j=2,int k=3) ;
►n() Æ n(1,2,3)
2
►n(2) Æ n(2,2,3)
C++ As a Better C
►n(3,4) Æ n(3,4,3)
►n(5,6,7) Æn(5,6,7)
Function
Function Declarations
Declarations and
and Definitions
Definitions
►C++ uses a stricter type checking.
►In function declarations (prototypes) the data types of the
2
int main()
{
:
}
char grade (int exam_1, int exam_2, int final_exam) // definition
{
: // body of function
}
Function
Function Declarations
Declarations and
and Definitions
Definitions
►In C++ a return type must be specified; a missing return
type does not default to int as is the case in C.
2
Reference Operator ⎯
Reference Operator ⎯&&
►This operator provides an alternative name for storage
►There are two usages of the operator
2
C++ As a Better C
n int n ;
int& nn = n ;
double a[10] ;
double& last = a[9] ;
const char& new_line = '\n' ;
j 5
*a = *b ;
…
C++ As a Better C
*b = temp ; } a adr_i
b adr_j
int main(){
int i=3,j=5 ; stack
swap(&i,&j) ; GDA
adr_j
cout << i << " " << j << endl ;
adr_i
} 53
Object Oriented Programming 80
NotesHub.co.in | Download Android App
b = temp ; }
C++ As a Better C
int main(){
int i=3,j=5 ;
swap(i,j) ;
cout << i << " " << j << endl ;
} 53
Object Oriented Programming 81
NotesHub.co.in | Download Android App
a2 = a3 ; int main(){
C++ As a Better C
a3 = a4 ; int x=1,y=2,z=3,w=4;
} shift(x,y,z,w) ;
cout << x << y << z << w << endl;
return 0 ;
}
squareByPointer(&x) ; }
cout << x << endl ;
squareByReference(y) ;
cout << y << endl ;
4
z = squareByValue(z) ;
9
cout << z << endl ;
16
}
Object Oriented Programming 83
NotesHub.co.in | Download Android App
const
const Reference
Reference
►To prevent the function from changing the parameter
accidentally, we pass the argument as constant reference to
the function.
2
Return
Return by
by reference
reference
►By default in C++, when a function returns a value: return expression;
expression is evaluated and its value is copied into stack. The calling function
reads this value from stack and copies it into its variables.
2
►One result of using “return by reference” is that the function which returns a
parameter by reference can be used on the left side of an assignment
statement.
int& max( const int a[], int length) { // Returns an integer reference
int i=0; // indices of the largest element
for (int j=0 ; j<length ; j++)
if (a[j] > a[i]) i = j;
return a[i]; // returns reference to a[i]
}
int main() {
int array[ ] = {12, -54 , 0 , 123, 63}; // An array with 5 elements
max(array,5) = 0; // write 0 over the largest element
:
const
const return
return parameter
parameter
To prevent the calling function from changing the return parameter
accidentally, const qualifier can be used.
const int& max( int a[ ], int length) // Can not be used on the left side of an
2
{ // assignment statement
int i=0; // indices of the largest element
C++ As a Better C
Never
Never return
return aa local
local variable
variable by
by reference!
reference!
Since a function that uses “return by reference” returns an actual
memory address, it is important that the variable in this memory
location remain in existence after the function returns.
2
new/delete
new/delete
►In ANSI C, dynamic memory allocation is normally performed with
standard library functions malloc and free.
free
►The C++ new and delete operators enable programs to perform
2
►The most basic example of the use of these operators is given below.
An int pointer variable is used to point to memory which is allocated by
the operator new. This memory is later released by the operator delete.
in C: int *p ;
p = (int *) malloc(N*sizeof(int)) ;
free(p) ;
in C++: int *p ;
int *p,*q ;
p = new int[N] ;
p = new int[9] ;
delete []p
[] ;
q = new int(9) ;
for(int i=0;i<row;i++)
C++ As a Better C
q[0][j]
q[0]
. .
2
. .
. .
q[i][j]
C++ As a Better C
. .
q[i]
for(int i=1;i<row;i++)
q[i] = q[i-1] + column ;
…..
delete []q[0] ;
delete []q ;
ith row jth column: q[i][j]
q[0]
.
.
.
.
2
q[i]
C++ As a Better C
.
. for (int i=1;i<row;i++)
. q[i] = q[i-1] + column ;
.
q[row-1]
double ** q ;
memoryAlign = column % 4;
memoryWidth = ( memoryAlign == 0 ) ?
column : (column+4 -memoryAlign) ;
2
for(int i=0;i<row;i++)
q[i] = q[i-1] + memoryWidth ;
…..
delete []q[0] ;
delete []q ;
Function
Function Overloading
Overloading
► Function Overloading
double average(const
average double a[],int size) ;
2
double average(const
average int a[],int size) ;
C++ As a Better C
double average(const
average int a[], const double b[],int size) ;
return (sum/size) ;
C++ As a Better C
}
p double average(const int a[],const double b[],int size) {
double sum = 0.0 ;
for(int i=0;i<size;i++) sum += a[i] + b[i] ;
return (sum/size) ;
}
int main() {
int w[5]={1,2,3,4,5} ;
2
double x[5]={1.1,2.2,3.3,4.4,5.5} ;
C++ As a Better C
Function
Function Templates
Templates
► Function Templates
template <typename T>
2
int main() {
int a[3]={1,2,3} ;
2
double b[5]={1.1,2.2,3.3,4.4,5.5} ;
C++ As a Better C
o printArray(b,5) ;
p printArray(c,7) ;
return 0 ;
}
}
void printArray(char *array,cont int size){
for(int i=0;i < size;i++)
cout << array[i] ;
cout << endl ;
}
Operator
Operator Overloading
Overloading
►In C++ it is also possible to overload the built-in C++
operators such as +, -, = and ++ so that they too invoke
different functions, depending on their operands.
2
Operator
Operator Overloading:
Overloading: Rules
Rules
►You can’t overload operators that don’t already exist in C++.
► You can not change numbers of operands. A binary operator
2
Operator
Operator Overloading
Overloading
►Functions of operators have the name operator and the
symbol of the operator. For example the function for the
2
struct SComplex{
float real,img;
};
SComplex operator+(SComplex v1, SComplex v2){
SComplex result; int main(){
result.real=v1.real+v2.real; SComplex c1={1,2},c2 ={5,1};
result.img=v1.img+v2.img; SComplex c3;
return result; c3=c1+c2; // c1+(c2)
} }
Object Oriented Programming 102
NotesHub.co.in | Download Android App
namespace
namespace
►When a program reaches a certain size it’s typically broken up into pieces,
each of which is built and maintained by a different person or group.
2
►Since C effectively has a single arena where all the identifier and function
names live, this means that all the developers must be careful not to
C++ As a Better C
accidentally use the same names in situations where they can conflict.
►The same problem come out if a programmer try to use the same names as
the names of library functions.
namespace
namespace
namespace programmer1{ // programmer1's namespace
int iflag; // programmer1's iflag
void g(int); // programmer1's g function
2
: // other variables
} // end of namespace
C++ As a Better C
Accessing
Accessing Variables
Variables
programmer1::iflag = 3; // programmer1's iflag
programmer2::iflag = -345; // programmer2's iflag
programmer1::g(6); // programmer1's g function
If a variable or function does not belong to any namespace, then it is
2
namespace
namespace
#include <iostream> int main() {
namespace F { float x = 19.1;
2
namespace
namespace
#include <iostream> int main() {
namespace F { using namespace G;
float x = 9; using namespace G::INNER_G;
2
namespace
namespace
#include <iostream> int main() {
namespace F { using namespace G;
float x = 9; std::cout << "x = " << x << std::endl;
2
namespace G { return 0;
using namespace F; }
float y = 2.0;
namespace INNER_G {
long x = 5L;
float z = 10.01;
}
}
Object Oriented Programming 108
NotesHub.co.in | Download Android App
namespace
namespace
#include <iostream> int main() {
namespace F { using namespace G;
float x = 9; std::cout << "x = " << x << std::endl;
2
namespace G { return 0;
float y = 2.0; }
namespace INNER_G {
long x = 5L;
float z = 10.01;
}
}
namespace
namespace
#include <iostream> int main() {
namespace F { using namespace G::INNER_G;
float x = 9; std::cout << "x = " << x << std::endl;
2
namespace G { return 0;
float y = 2.0; }
namespace INNER_G {
long x = 5L;
float z = 10.01;
}
}
Standard
Standard C++
C++ Header
Header Files
Files
►In the first versions of C++, mostly ‘.h’ is used as extension for the header
files.
2
►As C++ evolved, different compiler vendors chose different extensions for
file names (.hpp, .H , etc.). In addition, various operating systems have
C++ As a Better C
►To solve these problems, the standard uses a format that allows file names
longer than eight characters and eliminates the extension.
►For example, instead of the old style of including iostream.h, which looks
like this: #include <iostream.h>, you can now write: #include
<iostream>
Standard
Standard C++
C++ Header
Header Files
Files
►The libraries that have been inherited from C are still available with
the traditional ‘.h’ extension. However, you can also use them with the
more modern C++ include style by puting a “c” before the name. Thus:
2
►In standard C++ headers all declarations and definitions take place in a
namespace : std
►Today most of C++ compilers support old libraries and header files
too. So you can also use the old header files with the extension '.h'. For a
high-quality program prefer always the new libraries.
I/O
I/O
►Instead of library functions (printf, scanf), in C++ library
objects are used for IO operations.
2
int main() {
int i=5; // integer i is defined, initial value is 5
float f=4.6; // floating point number f is defined, 4.6
std::cout << "Integer Number = " << i << " Real Number= " << f;
return 0;
}
operator.
C++ As a Better C
#include<iostream>
using namespace std; // we don't need std:: anymore
int main() {
int i,j; // Two integers are defined
cout << "Give two numbers \n"; // cursor to the new line
cin >> i >> j; // Read i and j from the keyboard
cout << "Sum= " << i + j << "\n";
return 0;
}
Object Oriented Programming 115
NotesHub.co.in | Download Android App
std namespace
std namespace
#include <string>
#include <iostream>
2
int main() {
string test;
while(test.empty() || test.size() <= 5)
{
cout << "Type a string longer string. " << endl;
cin >> test;
}
printf(“%s”,test.c_str())
Object Oriented Programming 116
NotesHub.co.in | Download Android App
bool Type
bool Type
The type bool represents boolean (logical) values: true and false
Before bool became part of Standard C++, everyone tended to use different
techniques in order to produce Boolean-like behavior.
2
Because there’s a lot of existing code that uses an int to represent a flag, the
compiler will implicitly convert from an int to a bool (nonzero values will
produce true while zero values produce false).
Do not prefer to use integers to produce logical values.
bool is_greater; // Boolean variable: is_greater
is_greater = false; // Assigning a logical value
int a,b;
………………
is_greater = a > b; // Logical operation
if (is_greater) …… // Conditional operation
Object Oriented Programming 117
NotesHub.co.in | Download Android App
constant
constant
►In standard C, preprocessor directive #define is used to create
constants: #define PI 3.14
►C++ introduces the concept of a named constant that is just like a
2
constant:
const int MAX = 100;
…
MAX = 5; // Compiler Error!
►const can take place before (left) and after (right) the type. They are
always (both) allowed and equivalent.
int const MAX = 100; // The same as const int MAX = 100;
►Decreases error possibilities.
►To make your programs more readable, use uppercase font for
constant identifiers.
Object Oriented Programming 118
NotesHub.co.in | Download Android App
Use
Use of
of constant–1
constant–1
Another usage of the keyword const is seen in the declaration of pointers.
There are three different cases:
a) The data pointed by the pointer is constant, but the pointer itself
2
Use
Use of
of constant–2
constant–2
b) The pointer itself is a const pointer which may not be changed.
Whatever data is pointed to by the pointer may be changed.
2
Use
Use of
of constant–3
constant–3
c) Neither the pointer nor what it points to may be changed
The same pointer definition may also be written as follows:
2
Casts
Casts
►Traditionally, C offers the following cast construction:
(typename) expression
2
Example: f = (float)i / 2;
Following that, C++ initially also supported the function call style cast
C++ As a Better C
notation:
typename(expression)
Example: Converting an integer value to a floating point value
int i=5;
float f;
f = float(i)/2;
►But, these casts are now called old-style casts, and they are
deprecated. Instead, four new-style casts were introduced.
Object Oriented Programming 122
NotesHub.co.in | Download Android App
Casts:
Casts: static_cast
static_cast
►The static_cast<type>(expression) operator is used to convert one
type to an acceptable other type.
2
int i=5;
float f;
C++ As a Better C
f = static_cast<float>(i)/2;
Casts:
Casts: const_cast
const_cast
►The const_cast<type>(expression) operator is used to do away with
the const-ness of a (pointer) type.
2
Casts:
Casts: reinterpret_cast
reinterpret_cast
The reinterpret_cast<type>(expression) operator is used to reinterpret byte
patterns. For example, the individual bytes making up a structure can easily be
reached using a reinterpret_cast
2
struct S{ // A structure
int i1,i2; // made of two integers
C++ As a Better C
};
int main(){
S x; // x is of type S
x.i1=1; // fields of x are filled
x.i2=2;
unsigned char *xp; // A pointer to unsigned chars
xp = reinterpret_cast<unsigned char *> (&x);
for (int j=0; j<8; j++) // bytes of x on the screen
std::cout << static_cast<int>(*xp++);
return 0;
}
The structure S is made of two integers (2x4=8 bytes). x is a variable of type S.
Each byte of x can be reached by using the pointer xp.
Object Oriented Programming 125
NotesHub.co.in | Download Android App
Casts:
Casts: dynamic_cast
dynamic_cast
The dynamic_cast<>() operator is used in the context of inheritance
and polymorphism. We will see these concepts later. The discussion of
this cast is postponed until the section about polymorphism.
2
3 OO Programming Concepts
127
NotesHub.co.in | Download Android App
Content
Content
►OOP Concepts
– Class
OO Programming Concepts 3
• Encapsulation
• Information Hiding
– Inheritance
– Polymorphism
OOP
OOP Concepts
Concepts
►When you approach a programming problem in an object-
oriented language, you no longer ask how the problem
OO Programming Concepts 3
What
What is
is an
an Object?
Object?
►Many real-world objects have both a state (characteristics
that can change) and abilities (things they can do).
OO Programming Concepts 3
Classes
Classes and
and Objects
Objects
►Class is a new data type which is used to define objects. A
class serves as a plan, or a template. It specifies what data
OO Programming Concepts 3
Example
Example
A model (class) to define points in a graphics program.
►Points on a plane must have two properties (states):
OO Programming Concepts 3
Class
Class Definition:
Definition: Point
Point
class Point { // Declaration of Point Class
int x,y; // Properties: x and y coordinates
public: // We will discuss it later
OO Programming Concepts 3
Bodies
Bodies of
of Member
Member Functions
Functions
// A function to move the points
void Point::move(int new_x, int new_y) {
OO Programming Concepts 3
class Time {
UML Class Diagram (f rom Design
Tim e
int hour; Model)
Hour
int minute; Minute
int second ; Second
OO Programming Concepts 3
public: SetTime()
// Get Functions GetHour()
GetMinute()
int GetHour(){return hour;} ; GetSecond()
SetHour()
int GetMinute(){return minute;} ; SetMinute()
int GetSecond (){return second;} ; SetSecond()
PrintTim e()
// Set Functions
void SetTime(int h,int m,int s){hour=h;minute=m;second=s;};
void SetHour(int h){hour= (h>=0 && h<24) ? h : 0;} ;
void SetMinute(int m){minute= (m>=0 && m<60) ? m : 0;} ;
void SetSecond(int s){second= (s>=0 && s<60) ? s : 0;} ;
void PrintTime();
};
Object Oriented Programming 136
NotesHub.co.in | Download Android App
C++
C++ Terminology
Terminology
► A class is a grouping of data and functions. A class is very much
like a structure type as used in ANSI-C, it is only a pattern to be
OO Programming Concepts 3
Conclusion
Conclusion
► Until this slide we have discovered some features of the object-
oriented programming and the C++.
OO Programming Concepts 3
Defining
Defining Methods
Methods as
as inline
inline Functions
Functions
► In the previous example (Example 3.1), only the prototypes of the
member functions are written in the class declaration. The bodies of
the methods are defined outside the class.
OO Programming Concepts 3
Defining
Defining Dynamic
Dynamic Objects
Objects
► Classes can be used to define variables like built-in data types (int,
float, char etc.) of the compiler.
OO Programming Concepts 3
Defining
Defining Array
Array of
of Objects
Objects
► We may define static and dynamic arrays of objects. In the example
below we see a static array with ten elements of type Point.
OO Programming Concepts 3
int main()
{
Point array[10]; // defining an array with ten objects
array[0].move(15, 40); // 'move' message to the first element (indices 0)
array[1].move(75, 35); // 'move' message to the second element (indices 1)
: // message to other elements
for (int i = 0; i < 10; i++) // 'print' message to all objects in the array
array[i].print();
return 0;
}
Controlling
Controlling Access
Access to
to Members
Members
► We can divide programmers into two groups: class creators (those
who create new data types) and client programmers (the class
OO Programming Concepts 3
Controlling
Controlling Access
Access to
to Members
Members Con’t
►The second reason for access control is that, if it’s hidden,
the client programmer can’t use it, which means that the
OO Programming Concepts 3
Controlling
Controlling Access
Access to
to Members
Members Con’t
►The labels public: , private: (and protected: as we will see
later) are used to control access to a class' data members
OO Programming Concepts 3
and functions.
►Private class members can be accessed only by members
of that class.
►Public members may be accessed by any function in the
program.
►The default access mode for classes is private: After each
label, the mode that was invoked by that label applies until
the next label or until the end of class declaration.
Controlling
Controlling Access
Access to
to Members
Members Con’t
►The primary purpose of public members is to present to the
class's clients a view of the services the class provides.
OO Programming Concepts 3
point1.move(100,45) point1.print()
void
move(int,int) void
x print()
private
y members
Interface
public members bool is_zero() if( point1.is_zero() )
int main() {
Point p1; // p1 object is defined
int x,y; // Two variables to read some values from the keyboard
cout << " Give x and y coordinates “;
cin >> x >> y; // Read two values from the keyboard
if( p1.move(x,y) ) // send move message and check the result
p1.print(); // If result is OK print coordinates on the screen
else cout << "\nInput values are not accepted";
}
It is not possible to assign a value to x or y directly outside
the class.
p1.x = -10; //ERROR! x is private
Object Oriented Programming 147
NotesHub.co.in | Download Android App
struct Keyword
struct Keyword in
in C++
C++
►class and struct keywords have very similar meaning in
the C++.
OO Programming Concepts 3
Friend
Friend Functions
Functions and
and Friend
Friend Classes
Classes
► A function or an entire class may be declared to be a friend of another
class.
OO Programming Concepts 3
Friend
Friend Functions
Functions and
and Friend
Friend Classes
Classes Con’t
►A friend function has the right to access all members
(private, protected or public) of the class.
OO Programming Concepts 3
this Pointer
this Pointer
►Each object has its own data space
in the memory of the computer. x=100
move
OO Programming Concepts 3
Summary
Summary
Process Model
OO Programming Concepts 3
Point o;
heap
S
stack o
text main()
o.move(1,1);
data
Summary
Summary
Process Model
OO Programming Concepts 3
Point *p;
heap
S
stack p ?
text main()
data
Summary
Summary
stack p
text main()
p->move(1,1);
data
(*p).move(1,1);
Summary
Summary
Point p[10];
OO Programming Concepts 3
S
p p[1].move(1,1);
move(1,1)
Summary
Summary
Point *p;
OO Programming Concepts 3
p p= new Point[10];
H
p[1].move(1,1);
move(1,1)
(*(p+1)).move(1,1);
(p+1)->move(1,1);
159
NotesHub.co.in | Download Android App
Content
Content
►Constructors
Initializing and Finalizing Objects 4
– Default Constructor
– Copy Constructor
►Destructor
Initializing
Initializing Objects:
Objects: Constructors
Constructors
►The class designer can guarantee initialization of every
object by providing a special member function called the
Initializing and Finalizing Objects 4
constructor.
►The constructor is invoked automatically each time an
object of that class is created (instantiated).
►These functions are used to (for example) assign initial
values to the data members, open files, establish
connection to a remote computer etc.
►The constructor can take parameters as needed, but it
cannot have a return value (even not void).
Initializing
Initializing Objects:
Objects: Constructors
Constructors
►The constructor has the same name as the class itself.
Initializing and Finalizing Objects 4
Default
Default Constructors
Constructors
►A constructor that defaults all its arguments or requires no
arguments, i.e. a constructor that can be invoked with no
Initializing and Finalizing Objects 4
arguments.
class Point{ // Declaration Point Class
int x,y; // Properties: x and y coordinates
public:
Point(); // Declaration of the default constructor
bool move(int, int); // A function to move points
void print(); // to print coordinates on the screen
};
Point::Point() { // Default Constructor
cout << "Constructor is called..." << endl;
x = 0; // Assigns zero to coordinates
y = 0;
}
int main() {
Point p1, p2; // Default construct is called 2 times
Point *pp = new Point; // Default construct is called once
Object Oriented Programming 163
NotesHub.co.in | Download Android App
Constructors
Constructors with
with Parameters
Parameters
► Like other member functions, constructors may also have
parameters.
Initializing and Finalizing Objects 4
► This declaration shows that the users of the Point class have to give
two integer arguments while defining objects of that class.
Example:
Example: Constructors
Constructors with
with Parameters
Parameters
Point::Point(int x_first, int y_first) {
cout << "Constructor is called..." << endl;
Initializing and Finalizing Objects 4
Constructor
Constructor Parameters
Parameters with
with Default
Default Values
Values
►Constructors parameters may have default values
class Point{
Initializing and Finalizing Objects 4
public:
Point(int x_first = 0, int y_first = 0);
:
};
Point::Point(int x_first, int y_first) {
if ( x_first < 0 ) // If the given value is negative
x = 0; // Assigns zero to x
else x = x_first;
if ( y_first < 0 ) // If the given value is negative
y = 0; // Assigns zero to x
else y = y_first;
}
►Now, client of the class can create objects
Point p1(15,75); // x=15, y=75
Point p2(100); // x=100, y=0
►This function can be also used as a default constructor
Point p3; // x=0, y=0
Object Oriented Programming 166
NotesHub.co.in | Download Android App
Multiple
Multiple Constructors
Constructors
► The rules of function overloading is also valid for constructors. So, a
class may have more than one constructor with different type of
Initializing and Finalizing Objects 4
input parameters.
Point::Point() { // Default constructor
............... // Body is not important
}
Initializing
Initializing Arrays
Arrays of
of Objects
Objects
►When an array of objects is created, the default
Initializing and Finalizing Objects 4
Initializing
Initializing Arrays
Arrays of
of Objects
Objects Con’t
►// Constructor
Point(int x_first, int y_first = 0) { .... }
Initializing and Finalizing Objects 4
Initializing
Initializing Arrays
Arrays of
of Objects
Objects Con’t
►If the class has also a default constructor the programmer may
define an array of objects as follows:
Initializing and Finalizing Objects 4
Constructor
Constructor Initializers
Initializers
►Instead of assignment statements constructor initializers can be used
to initialize data members of an object.
Initializing and Finalizing Objects 4
Solution
Solution
The solution is to use a constructor initializer. class C{
const int CI;
Initializing and Finalizing Objects 4
int x;
public:
C() : CI(0) {
x = -2;
}
class C{ };
const int CI;
int x; All data members of a class
public: can be initialized by using
C( int a ) : CI(0), x (a) constructor initializers.
{}
};
Object Oriented Programming 172
NotesHub.co.in | Download Android App
Destructors
Destructors
►The destructor is very similar to the constructor except
that it is called automatically
Initializing and Finalizing Objects 4
Example
Example
class String{
Initializing and Finalizing Objects 4
Copy
Copy Constructor
Constructor
► It is a special type of constructors and used to copy the contents of
an object to a new object during construction of that new object.
Initializing and Finalizing Objects 4
Copy
Copy Constructor
Constructor Con’t
►For example the copy constructor, generated by the
compiler for the String class will do the following job:
Initializing and Finalizing Objects 4
Shallow Copy
size: 8 8 size
Copy
Copy Constructor
Constructor Con’t
► The copy constructor, generated by the compiler can not copy the
memory locations pointed by the member pointers.
Initializing and Finalizing Objects 4
► The programmer must write its own copy constructor to perform these
operations.
size: 8 8 size
contents: 0x008d0080 Deep Copy 0x00ef0080
1 1
\0 \0
Object Oriented Programming 178
NotesHub.co.in | Download Android App
Example:
Example: The
The copy
copy constructor
constructor of
of the
the String
String class
class
class String {
int size;
Initializing and Finalizing Objects 4
char *contents;
public:
String(const char *); // Constructor
String(const String &); // Copy Constructor
void print(); // Prints the string on the screen
~String(); // Destructor
};
String::String(const String &object_in) { // Copy Constructor
cout<< "Copy Constructor has been invoked" << endl;
size = object_in.size;
contents = new char[size + 1]; // +1 for null character
strcpy(contents, object_in.contents);
}
int main() {
String my_string("string 1");
my_string.print();
String other = my_string; // Copy constructor is invoked
String more(my_string); // Copy constructor is invoked
Constant
Constant Objects
Objects and
and Const
Const Member
Member Functions
Functions
►The programmer may use the keyword const to specify that an
object is not modifiable.
Initializing and Finalizing Objects 4
static Class
static Class Members
Members
►Normally, each object of a class has its own copy of all
data members of the class.
Initializing and Finalizing Objects 4
static Class
static Class Members
Members
►Static data members exist even no objects of that class
exist.
Initializing and Finalizing Objects 4
class A {
char c;
Initializing and Finalizing Objects 4
int main(){
std::cout<<"\n Entering 1. BLOCK............";
Initializing and Finalizing Objects 4
A a,b,c;
{
std::cout<<"\n Entering 2. BLOCK............";
A d,e;
std::cout<<"\n Exiting 2. BLOCK............";
}
std::cout<<"\n Exiting 1. BLOCK............";
}
Entering 1. BLOCK............
Constructor 1
Constructor 2
Initializing and Finalizing Objects 4
Constructor 3
Entering 2. BLOCK............
Constructor 4
Constructor 5
Exiting 2. BLOCK............
Destructor 5
Destructor 4
Exiting 1. BLOCK............
Destructor 3
Destructor 2
Destructor 1
Object Oriented Programming 187
NotesHub.co.in | Download Android App
Passing
Passing Objects
Objects to
to Functions
Functions as
as Arguments
Arguments
► Objects should be passed or returned by reference unless there are
compelling reasons to pass or return them by value.
Initializing and Finalizing Objects 4
Avoiding
Avoiding Temporary
Temporary Objects
Objects
► In the previous example, within the add function a temporary object
is defined to add two complex numbers.
Initializing and Finalizing Objects 4
Nesting
Nesting Objects:
Objects: Classes
Classes as
as Members
Members of
of Other
Other Classes
Classes
►A class may include objects of other classes as its data
members.
Initializing and Finalizing Objects 4
constructor im numerator
Fraction print()
denominator
constructor ComplexFrac
print()
Composition
Composition &
& Aggregation
Aggregation
►The relation between Fraction and ComplexFrac is called
Initializing and Finalizing Objects 4
public:
Fraction(int, int); // CONSTRUCTOR
void print() const;
};
Fraction::Fraction(int num, int denom) { // CONSTRUCTOR
numerator = num;
if (denom==0) denominator = 1;
else denominator = denom;
cout << "Constructor of Fraction" << endl;
}
void Fraction::print() const {
cout << numerator << "/" << denominator << endl;
}
Object Oriented Programming 192
NotesHub.co.in | Download Android App
Example: A class to define complex numbers. It contains two objects as
members
class ComplexFrac { // Complex numbers, real and imag. parts are fractions
Fraction re, im; // objects as data members of another class
Initializing and Finalizing Objects 4
public:
ComplexFrac(int,int); // Constructor
void print() const;
};
ComplexFrac::ComplexFrac(int re_in, int im_in) : re(re_in, 1) , im(im_in, 1)
{
:
}
void ComplexFrac::print() const { Data members are initialized
re.print();
im.print();
}
int main() { When an object goes out of scope, the
ComplexFrac cf(2,5); destructors are called in reverse order:
cf.print();
The enclosing object is destroyed first,
return 0;
} then the member (inner) object.
Object Oriented Programming 193
NotesHub.co.in | Download Android App
Working
Working with
with Multiple
Multiple Files
Files
(Separate
(Separate Compilation)
Compilation)
Initializing and Finalizing Objects 4
Working
Working with
with Multiple
Multiple Files
Files
header header header Only declarations
Initializing and Finalizing Objects 4
COMPILER
LINKER
executable
5 Operator Overloading
197
NotesHub.co.in | Download Android App
Operator
Operator Overloading
Overloading
►It is possible to overload the built-in C++ operators such
as +, >=, and ++ so that they invoke different functions,
depending on their operands.
Operator Overloading 5
►a+b will call one function if a and b are integers, but will
call a different function if a and b are objects of a class.
►Operator overloading makes your program easier to write
and to understand.
►Overloading does not actually add any capabilities to C++.
Everything you can do with an overloaded operator you
can also do with a function.
►However, overloaded operators make your programs
easier to write, read, and maintain.
Operator
Operator Overloading
Overloading
►Operator overloading is only another way of calling a
function.
►You have no reason to overload an operator except if it
Operator Overloading 5
will make the code involving your class easier to write and
especially easier to read.
►Remember that code is read much more than it is written
Limitations
Limitations
►You can’t overload operators that don’t already exist in
C++. You can overload only the built-in operators.
►You can not overload the following operators
Operator Overloading 5
.
*
->
,
::
?:
sizeof
Limitations
Limitations
►The C++ operators can be divided roughly into binary and
unary. Binary operators take two arguments. Examples are
a+b, a-b, a/b, and so on. Unary operators take only one
Operator Overloading 5
Overloading
Overloading the
the ++ operator
operator for
for ComplexT
ComplexT
/* A class to define complex numbers */
class TComplex {
float real,img;
public:
Operator Overloading 5
: // Member functions
TComplex operator+(TComplex&); // header of operator+
function
};
/* The Body of the function for operator + */
TComplex TComplex::operator+(TComplex& z) {
TComplex result;
result.real = real + z.real; int main() {
result.img = img + z.img;
return result; TComplex z1,z2,z3;
} : // Other operations
z3=z1+z2; like z3 = z1.operator+(z2);
}
Object Oriented Programming 202
NotesHub.co.in | Download Android App
Overloading
Overloading the
the Assignment
Assignment Operator
Operator (=)
(=)
►Because assigning an object to another object of the same
type is an activity most people expect to be possible, the
compiler will automatically create a type::operator=(const
Operator Overloading 5
Overloading
Overloading the
the Assignment
Assignment Operator
Operator (=)
(=)
void ComplexT::operator=(const ComplexT& z)
{
Operator Overloading 5
re = z.re;
im = z.im;
}
Overloading
Overloading the
the Assignment
Assignment Operator
Operator (=)
(=)
►In general, you don’t want to let the compiler do this for
you.
Operator Overloading 5
Example
Example
class string {
int size;
char *contents;
Operator Overloading 5
public:
void operator=(const string &); // assignment operator
: // Other methods
};
void string::operator=(const string &s)
{
size = s.size;
delete []contents;
contents = new char[size+1];
strcpy(contents, s.contents);
}
Object Oriented Programming 206
NotesHub.co.in | Download Android App
Operator
Operator Provided
Provided by
by the
the Compiler
Compiler
0x008d0080 0x008d0080
0x00185d12
contents: contents X
s a
t b
r c
i \0
n
g Data is still wasting
memory space.
1
\0
Operator
Operator of
of the
the Programmer
Programmer
0x008d0080 0x00185d12
0x00ef0080
contents contents
X
s s a
t t b
r r c
i i \0
n n
g g
1 1
\0 \0
Return
Return value
value of
of the
the assignment
assignment operator
operator
►When there’s a void return value, you can’t chain the
assignment operator (as in a = b = c ).
►To fix this, the assignment operator must return a reference
Operator Overloading 5
Copy
Copy Constructor
Constructor vs.
vs. Assignment
Assignment Operator
Operator
►The difference between the assignment operator and the
copy constructor is that the copy constructor actually
creates a new object before copying data from another
Operator Overloading 5
Copy
Copy Constructor
Constructor vs.
vs. Assignment
Assignment Operator
Operator
►A a;
►A b(a);
Operator Overloading 5
►b=a;
►A c=a;
Overloading
Overloading Unary
Unary Operators
Operators
► Unary operators operate on a single operand. Examples are the
increment (++) and decrement (--) operators; the unary minus, as in -5;
and the logical not (!) operator.
Operator Overloading 5
Overloading
Overloading the
the “[]”
“[]” Operator
Operator
►Same rules apply to all operators. So we don’t need to
discuss each operator. However, we will examine some
interesting operators.
Operator Overloading 5
Overloading
Overloading the
the “[]”
“[]” Operator
Operator
►The first declaration can be used when the overloaded
subscript operator modifies the object. The second
declaration is used with a const object; in this case, the
Operator Overloading 5
if(i < 0)
return contents[0]; // return first character
if(i >= size)
return contents[size-1]; // return last character
return contents[i]; // return i th character
}
int main() {
String s1("String 1");
s1[1] = 'p'; // modifies an element of the contents
s1.print();
cout << " 5 th character of the string s1 is: " << s1[5] << endl;
return 0;
}
Object Oriented Programming 216
NotesHub.co.in | Download Android App
Overloading
Overloading the
the “()”
“()” Operator
Operator
The function call operator is unique in that it allows any number of
arguments.
class C{
returntype operator ( ) (paramtypes);
Operator Overloading 5
};
If c is an object of class C, the expression
c(i, j, k) is interpreted as
c.operator( )( i, j, k )
Example: The function call operator is overloaded to print complex
numbers on the screen. In this example the function call operator does
not take any arguments.
// The function call operator without any argument, it prints a complex number
void ComplexT::operator( )( ) const {
cout << re << " , " << im << endl ;
}
Object Oriented Programming 217
NotesHub.co.in | Download Android App
Example: The function call operator is overloaded to copy a
part of the contents of a string into a given memory location.
In this example the function call operator takes two arguments:
the address of the destination memory and the numbers of
characters to copy.
Operator Overloading 5
"Pre"
"Pre" and
and "post"
"post" form
form of
of operators
operators ++
++ and
and --
--
►Recall that ++ and -- operators come in “pre” and “post”
form.
►If these operators are used with an assignment statement
Operator Overloading 5
Post-Increment
Post-Increment Operator
Operator
// postincrement operator
ComplexT ComplexT::operator++(int) {
ComplexT temp;
Operator Overloading 5
Pre-Increment
Pre-Increment Operator
Operator
// postincrement operator
ComplexT ComplexT::operator++() {
Operator Overloading 5
6 Inheritance
222
NotesHub.co.in | Download Android App
Content
Content
►Inheritance
►Reusability in Object-Oriented Programming
6
►Access Control
►Public and Private Inheritance
►Constructor, Destructor and Assignment Operator in
Inheritance
►Multiple Inheritance
►Composition vs Inheritance
Inheritance
Inheritance
►Inheritance is one of the ways in object-oriented
programming that makes reusability possible.
6
►By reusing classes, you can reduce the time and effort
needed to develop a program, and make software more
robust and reliable.
Inheritance
Inheritance
History
►The earliest approach to reusability was simply rewriting
6
project.
►You paste the old code into your new source file, make a
few modifications to adapt it to the new environment.
Now you must debug the code all over again. Often you’re
sorry you didn’t just write new code.
Inheritance
Inheritance
►To reduce the bugs introduced by modification of code,
programmers attempted to create self-sufficient program
elements in the form of functions.
6
Reusability
Reusability in
in Object-Oriented
Object-Oriented Programming
Programming
►A powerful new approach to reusability appears in object-
oriented programming is the class library. Because a class
more closely models a real-world entity, it needs less
6
situation.
►Once a class has been created and tested, it should
(ideally) represent a useful unit of code.
►This code can be used in different ways again.
Reusability
Reusability in
in Object-Oriented
Object-Oriented Programming
Programming
1. The simplest way to reuse a class is to just use an object
of that class directly. The standard library of the C++ has
6
Reusability
Reusability in
in Object-Oriented
Object-Oriented Programming
Programming
2. The second way to reuse a class is to place an object of
that class inside a new class.
6
Reusability
Reusability in
in Object-Oriented
Object-Oriented Programming
Programming
3. The third way to reuse a class is inheritance, which is
described next. Inheritance is referred to as a "is a" or "a
6
string
string
►While a character array can be fairly useful, it is quite
limited. It’s simply a group of characters in memory, but if
you want to do anything with it you must manage all the
6
little details.
Inheritance
string
string
#include <string> // Standard header file of C++ (inc. string class)
#include <iostream>
using namespace std;
6
int main() {
Inheritance
string
string
► The first two strings, s1 and s2, start out empty, while s3 and s4
show two equivalent ways to initialize string objects from character
arrays (you can just as easily initialize string objects from other
string objects).
6
► You can assign to any string object using ‘=’. This replaces the
previous contents of the string with whatever is on the right-hand
Inheritance
side, and you don’t have to worry about what happens to the
previous contents – that’s handled automatically for you.
► To combine strings you simply use the ‘+’ operator, which also
allows you to combine character arrays with strings. If you want to
append either a string or a character array to another string, you can
use the operator ‘+=’.
► Finally, note that cout already knows what to do with strings, so you
can just send a string (or an expression that produces a string, which
happens with
► s1 + s2 + "!" directly to cout in order to print it.
Inheritance
Inheritance
►OOP provides a way to modify a class without changing
its code.
6
"is
"is a"
a" Relationship
Relationship
►We know that PCs, Macintoshes and Cray are kinds of
computers; a worker, a section manager and general
6
Inheritance
Inheritance Syntax
Syntax
►The simplest example of inheritance requires two classes:
a base class and a derived class.
6
►The base class does not need any special syntax. The
derived class, on the other hand, must indicate that it’s
Inheritance
principal is a teacher
int main() { principal (derived class )
Teacher t1;
teacher (base class )
6
Principal p1;
p1.setName(" Principal 1"); Name,
Inheritance
Redefining
Redefining Members
Members (Name
(Name Hiding)
Hiding)
►Some members (data or function) of the base class may not
suitable for the derived class. These members should be
redefined in the derived class.
6
Redefining
Redefining Members
Members
class Teacher{ // Base class
protected:
string name;
6
public:
void setName (const string & new_name) { name = new_name; }
void print() const;
};
Redefining
Redefining Members
Members
►Now the Principal class has two print() functions. The
members of the base class can be accessed by using the
6
Overloading
Overloading vs.
vs. Overriding
Overriding
►If you modify the signature and/or the return type of a
member function from the base class then the derived class
has two member functions with the same name. But this is
6
};
Inheritance
B b;
int j=b.fa2(1);
b.ia1=4; // B::ia1
b.ia2=3; // A::ia2 if ia2 is public in A
float y=b.fa1(3.14); // B::fa1
b.fa1(); // ERROR fa1 function in B hides the function of A
b.A::fa1(); // OK
b.A::ia1=1; // OK
}
Object Oriented Programming 244
NotesHub.co.in | Download Android App
Example
Example
b
A::ia1
6
Inheritance
3 A::ia2 b.ia1=4;
b.ia2=3;
4 B::ia1
Access
Access Control
Control
►Remember, when inheritance is not involved, class member
functions have access to anything in the class, whether public or
private, but objects of that class have access only to public members.
6
public and protected members of the base class, but not private
members. Objects of a derived class can access only public members of
the base class.
Access Base Class Derived Class Object
public: };
void fa1();
Inheritance
int fa2(int);
}; float B::fa1(float f){
ia1= 2.22 ;
ia2=static_cast<int>(f*f);
}
};
class Principal : public Teacher { // Derived class
private: // Default
string school_name;
int numOfTeachers;
public:
void setSchool(const string & s_name) { school_name = s_name; }
void print() const;
int getAge() const { return age; } // It works because age is protected
const string & get_name(){ return name;}// ERROR! name is private
};
Object Oriented Programming 248
NotesHub.co.in | Download Android App
int main()
{
teacher t1;
6
principal p1;
Inheritance
t1.numberOfStudents=54;
t1.setName(“Sema Catir");
p1.setSchool(“Halide Edip Adivar Lisesi");
}
Protected
Protected vs.
vs. Private
Private Members
Members
►In general, class data should be private. Public data is open to
modification by any function anywhere in the program and should
6
class. Anyone can derive one class from another and thus gain access
to the base class’s protected data. It’s safer and more reliable if derived
classes can’t access base class data directly.
►But in real-time systems, where speed is important, function calls to
access private members is a time-consuming process. In such systems
data may be defined as protected to make derived classes access data
directly and faster.
251
NotesHub.co.in | Download Android App
Public
Public Inheritance
Inheritance
►In inheritance, you usually want to make the access
specifier public.
6
class Base
{ };
Inheritance
Private
Private Inheritance
Inheritance
class Base
{ };
6
Class A
private
protected
6
public
Inheritance
protected protected
ObjB ObjC
Redefining
Redefining Access
Access
►Access specifications of public members of the base class
can be redefined in the derived class.
6
►If you want any of them to be visible, just say their names
(no arguments or return values) along with the using
keyword in the public section of the derived class:
d.f(); // OK
int i;
return 0;
Inheritance
void f();
};
};
class Derived : private Base{ // All members of Base are private now
int m;
public:
Base::f(); // f() is public again
void fb1();
};
d.f(); // OK
int i;
return 0;
Inheritance
void f(int);
};
bool f(int,float);
};
class Derived : private Base{ // All members of Base are private now
int m;
public:
Base::f(int); // f(int) is public again
void fb1();
};
Object Oriented Programming 257
NotesHub.co.in | Download Android App
Special
Special Member
Member Functions
Functions and
and Inheritance
Inheritance
►Some functions will need to do different things in the base class and
the derived class. They are the overloaded = operator, the destructor,
and all constructors.
6
Constructors
Constructors and
and Inheritance
Inheritance
►When you define an object of a derived class, the base class
constructor will be called before the derived class constructor. This is
because the base class object is a subobject—a part—of the derived
class object, and you need to construct the parts before you can
construct the whole.
6
►If the base class has a constructor that needs arguments, this
constructor must be called before the constructor of the derived class.
Inheritance
int main() {
Principal p1("Ali Bilir", 20); // An object of derived class is defined
return 0;
}
►If the base class has a constructor, which must take some arguments, then
the derived class must also have a constructor that calls the constructor of
the base with proper arguments. 260
NotesHub.co.in | Download Android App
Destructors
Destructors and
and Inheritance
Inheritance
►Destructors are called automatically.
►When an object of the derived class goes out of scope, the
6
#include <iostream.h>
class B {
public:
B() { cout << "B constructor" << endl; }
~B() { cout << "B destructor" << endl; }
6
};
class C : public B {
Inheritance
public:
C() { cout << "C constructor" << endl; }
~C() { cout << "C destructor" << endl; }
};
int main(){
std::cout << "Start" << std::endl;
C ch; // create a C object
std::cout << "End" << std::endl;
}
Object Oriented Programming 262
NotesHub.co.in | Download Android App
#include <iostream.h>
class A { Example:
Example: Constructor
Constructor Chain
Chain
private:
int x;
float y; class C : public B {
private:
public:
int r;
A(int i, float f) : float s;
x(i), y(f) // initialize A public:
{ cout << "Constructor A" << endl; } C(int i1,float f1, int i2,float f2,int i3,float f3) :
void display() { B(i1, f1, i2, f2), // initialize B
cout << intA << ", " << floA << "; ";} r(i3), s(f3) // initialize C
}; { cout << "Constructor C" << endl; }
class B : public A { void display() {
B::display();
private: cout << r << ", " << s;
int v; }
float w; };
public:
B(int i1, float f1, int i2, float f2) :
A(i1, f1), // initialize A int main() {
v(i2), w(f2) // initialize B
{ cout << "Constructor B" << endl; }
C c(1, 1.1, 2, 2.2, 3, 3.3);
void display(){ cout << "\nData in c = ";
A::display(); c.display();
cout << v << ", " << w << "; "; } example19.cpp
}
}; 263
NotesHub.co.in | Download Android App
Explanation
Explanation
►A C class is inherited from a B class, which is in turn
inherited from a A class.
►Each class has one int and one float data item.
6
initialize the data for the class and all ancestor classes. This
means two arguments for the A class constructor, four for B
(which must initialize A as well as itself), and six for C
(which must initialize A and B as well as itself).
►Each constructor calls the constructor of its base class.
Explanation
Explanation
►In main(), we create an object of type C, initialize it to six
values, and display it.
►When a constructor starts to execute, it is guaranteed that
6
Explanation:
Explanation: Constructor
Constructor Chain
Chain
►You never need to make explicit destructor calls because
there’s only one destructor for any class, and it doesn’t take
6
any arguments.
►The compiler ensures that all destructors are called, and
Inheritance
Assignment
Assignment Operator
Operator and
and Inheritance
Inheritance
►Assignment operator of the base class can not be the
assignment operator of the derived class.
►Recall the String example.
6
class String {
protected:
Inheritance
int size;
char *contents;
public:
const String & operator=(const String &); // assignment operator
: // Other methods
};
const String & String::
tring operator=(const String &in_object) {
size = in_object.size;
delete[ ] contents; // delete old contents
contents = new char[size+1];
strcpy(contents, in_object.contents);
return *this;
}
Object Oriented Programming 267
NotesHub.co.in | Download Android App
►Example: Class String2 is derived from class String. If an
assignment operator is necessary it must be written
class String2 : public String { // String2 is derived from String
int size2;
char *contents2;
public:
6
};
// **** Assignment operator for String2 ****
const String2 & String2::operator=(const String2 &in_object) {
size = in_object.size; // inherited size
delete []contents;
contents= strdup(in_object.contents);
size2 = in_object.size2;
delete[ ] contents2;
contents2 = strdup(in_object.contents2);
return *this;
}
Object Oriented Programming 268
NotesHub.co.in | Download Android App
In previous example, data members of String (Base) class must be protected. Otherwise
methods of the String2 (Derived) can not access them.
The better way to write the assignment operator of String2 is to call the assignment
operator of the String (Base) class.
Now, data members of String (Base) class may be private.
Composition
Composition vs.
vs. Inheritance
Inheritance
►Every time you place instance data in a class, you are
creating a “has a” relationship. If there is a class Teacher and
one of the data items in this class is the teacher’s name, I can
6
Composition
Composition vs.
vs. Inheritance
Inheritance
►Inheritance in OOP mirrors the concept that we call
generalization in the real world. If I model workers, managers
and researchers in a factory, I can say that these are all
6
a.f( ).
►Notice that the only time you can talk about redefinition
of functions is during inheritance; with a member object you
can only manipulate the public interface of the object, not
redefine it.
►In addition, calling f( ) for an object of class C would not
call a.f( ) if C::f( ) had not been defined, whereas it would
call B::f( ).
Object Oriented Programming 273
NotesHub.co.in | Download Android App
Multiple
Multiple Inheritance
Inheritance
class Base1{ // Base 1 int main(){
public: Base1 Base2 Deriv d;
int a;
void fa1(); d.a=4;
6
Repeated
Repeated Base
Base Classes
Classes Gparent
class Gparent
{ };
class Mother : public Gparent Mother Father
{ };
6
Repeated
Repeated Base
Base Classes
Classes
►Suppose there’s a data item in Gparent:
class Gparent {
protected:
6
int gdata;
};
Inheritance
Solution:
Solution: Virtual
Virtual Base
Base Classes
Classes
►You can fix this using a new keyword, virtual, when deriving Mother
and Father from Gparent :
class Gparent
6
{ };
class Mother : virtual public Gparent
Inheritance
{ };
class Father : virtual public Gparent
{ }; example21.cpp
class Child : public Mother, public Father
{ };
►The virtual keyword tells the compiler to inherit only one subobject
from a class into subsequent derived classes. That fixes the ambiguity
problem, but other more complicated problems arise that are too
complex to delve into here.
►In general, you should avoid multiple inheritance, although if you
have considerable experience in C++, you might find reasons to use it in
unusual situations.
Object Oriented Programming 277
NotesHub.co.in | Download Android App
class Base
{
public:
int a,b,c; Base
6
};
class Derived : public Base
Inheritance
{ Drived
public:
int b;
};
Derived2
class Derived2 : public Derived
{
public:
int c;
};
class A {
...
};
6
class B {
...
Inheritance
}; B
class C { A C
...
};
class D : public A, public B, private C { D
...
};
class L {
public:
int next;
};
6
class A : public L {
L L
Inheritance
...
};
class B : public L {
... A B
};
class C : public A, public B { C
void f() ;
...
};
class L {
public:
int next;
6
};
class A : virtual public L { L
Inheritance
...
};
class B : virtual public L { A B
...
}; C
class C : public A, public B {
...
};
class B {
...
};
class X : virtual public B {
6
... B B
};
Inheritance
class B {
...
};
class X : virtual public B {
6
... B B
};
Inheritance
class Y : public B { X Y Z
...
};
class Z : public B { AA
...
};
class AA : public X, public Y , public Z {
...
};
class B {
...
};
class X : virtual public B {
6
... B
};
Inheritance
7 Object Pointers
285
NotesHub.co.in | Download Android App
Pointers
Pointers to
to Objects
Objects
►Objects are stored in memory, so pointers can point to
objects just as they can to variables of basic types.
The new Operator:
Object Pointers 7
Pointers
Pointers to
to Objects
Objects
The delete Operator
► To ensure safe and efficient use of memory, the new
operator is matched by a corresponding delete operator
that releases the memory back to the operating system.
Object Pointers 7
►If you create an array with new Type[ ];, you need the
brackets when you delete it:
int * ptr = new int[10];
:
delete [ ] ptr;
Don’t forget the brackets when deleting arrays of objects. Using them ensures
that all the members of the array are deleted and that the destructor is called
for each one. If you forget the brackets, only the first element of the array will
be deleted.
Object Oriented Programming 287
NotesHub.co.in | Download Android App
Example
Example
class String { int main() {
int size; String *sptr = new String[3];
char *contents; String s1("String_1");
public:
Object Pointers 7
String s2("String_2");
String(); *sptr = s1;
String(const char *); *(sptr + 1) = s2;
String(const String &); sptr->print();
const String& operator=(const String &); (sptr+1)->print();
void print() const ; sptr[1].print();
~String(); delete[] sptr;
}; return 0;
}
Linked
Linked List
List of
of Objects
Objects
A class may contain a pointer to objects of its type.
This pointer can be used to build a chain of objects, a linked list.
class Teacher {
Object Pointers 7
Linked
Linked List
List of
of Objects
Objects
►In the previous example the Teacher class must have a
pointer to the next object and the list class must be declared
as a friend, to enable users of this class building linked lists.
Object Pointers 7
Linked
Linked List
List of
of Objects
Objects
class Teacher_node{
friend class Teacher_list;
Teacher * element; // The element of the list
Teacher_node * next; // next node
Object Pointers 7
Pointers
Pointers and
and Inheritance
Inheritance
►If a class Derived has a public base class Base, then a
pointer to Derived can be assigned to a variable of type
pointer to Base without use of explicit type conversion. A
pointer to Base can carry the address of an object of
Object Pointers 7
Derived.
►The opposite conversion, for pointer to Base to pointer to
Derived, must be explicit.
►For example, a pointer to Teacher can point to objects of
Teacher and to objects of Principal. A principal is a
teacher, but a teacher is not always a principal.
Pointers
Pointers and
and Inheritance
Inheritance
class Base{
};
Object Pointers 7
};
Derived d;
Base *bp = &d; // implicit conversion
Derived *dp = bp; // ERROR! Base is not Derived
dp = static_cast<Derived *>(bp); // explicit conversion
Pointers
Pointers and
and Inheritance
Inheritance
►If the class Base is a private base of Derived , then the
implicit conversion of a Derived* to Base* would not be
done.
Object Pointers 7
Pointers
Pointers and
and Inheritance
Inheritance
class Base{
int m1;
public:
Object Pointers 7
Heterogeneous
Heterogeneous Linked
Linked Lists
Lists
►Using the inheritance and pointers, heterogeneous linked
lists can be created.
►A list specified in terms of pointers to a base class can
Object Pointers 7
8 Polymorphism
297
NotesHub.co.in | Download Android App
Content
Content
►Polymorphism
►Virtual Members
►Abstract Class
8
Polymorphism
Polymorphism
Polymorphism
► There are three major concepts in object-oriented programming:
1. Classes,
2. Inheritance,
8
Polymorphism
Polymorphism
► Polymorphism means “taking many shapes”. The minister’s single
instruction is polymorphic because it looks different to different
kinds of personnel.
► Typically, polymorphism occurs in classes that are related by
8
Normal
Normal Member
Member Functions
Functions Accessed
Accessed with
with Pointers
Pointers
class Square { // Base Class
protected:
double edge;
8
public:
Polymorphism
else ptr=&C ;
ptr→area();
area // which Area ???
Polymorphism
► ptr = &C;
► Remember that it’s perfectly all right to assign an address of one
type (Derived) to a pointer of another (Base), because pointers to
objects of a derived class are type compatible with pointers to
objects of the base class.
► Now the question is, when you execute the statement
ptr->area();
what function is called? Is it Square::area() or Cube::area()?
Object Oriented Programming 302
NotesHub.co.in | Download Android App
Virtual
Virtual Member
Member Functions
Functions Accessed
Accessed with
with Pointers
Pointers
Let’s make a single change in the program: Place the keyword virtual
in front of the declaration of the area() function in the base class.
class Square { // Temel sinif
protected:
8
double edge;
Polymorphism
public:
Square(double e):edge(e){ } // temel sinif kurucusu
virtual double area(){
area return( edge * edge ) ; }
};
class Cube : public Square { // Turetilmis sinif
public:
Cube(double e):Square(e){} // Turetilmis sinif kurucusu
double area(){
area return( 6.0 * edge * edge ) ; }
};
Object Oriented Programming 303
NotesHub.co.in | Download Android App
int main(){
Square S(2.0) square.cpp ;
Cube C(8.0) ;
8
Square *ptr ;
char c ;
Polymorphism
Virtual
Virtual Member
Member Functions
Functions Accessed
Accessed with
with Pointers
Pointers
The function in the base class (Teacher) is executed in both cases. The compiler ignores
the contents of the pointer ptr and chooses the member function that matches the type
of the pointer.
Let’s make a single change in the program: Place the keyword virtual in front of the
declaration of the print() function in the base class.
8
string *name;
int numOfStudents;
public:
Teacher(const string &, int); // Constructor of base
virtual void print() const; // A virtual (polymorphic) function
};
class Principal : public Teacher{ // Derived class
string *SchoolName;
public:
Principal(const string &, int , const string &);
void print() const; // It is also virtual (polymorphic)
};
Object Oriented Programming 305
NotesHub.co.in | Download Android App
Late
Late Binding
Binding
► Now, different functions are executed, depending on the contents of
ptr. Functions are called based on the contents of the pointer ptr, not
on the type of the pointer. This is polymorphism at work. I’ve made
print() polymorphic by designating it virtual.
8
Late
Late Binding
Binding
► At runtime, when the function call is executed, code that the
compiler placed in the program finds out the type of the object
whose address is in ptr and calls the appropriate print() function:
Teacher::print() or Principal::print(), depending on the class of the
8
object.
Polymorphism
How
How ItIt Works
Works
► Remember that, stored in memory, a normal object—that is, one
with no virtual functions—contains only its own data, nothing else.
► When a member function is called for such an object, the compiler
8
passes to the function the address of the object that invoked it. This
address is available to the function in the this pointer, which the
Polymorphism
How
How ItIt Works
Works
► With virtual functions, things are more complicated. When a derived
class with virtual functions is specified, the compiler creates a table—
an array—of function addresses called the virtual table.
► The Teacher and Principal classes each have their own virtual table.
8
There is an entry in each virtual table for every virtual function in the
Polymorphism
};
Polymorphism
50
address of an object.
move.l ptr, this ; this to object vptr
movea.l ptr, a0 ; a0 to object Virtual Table of Principal
movea.l (a0), a1 ; a1<-vptr t2 Teacher 2
jsr 4(a1) ; jsr print 35 &Principal::read
If the print() function would not a &Principal::print
virtual function: vptr
move.l ptr, this ; this to object Principal 1
jsr teacher_print p1
45
or
School 1
jsr principal_print
Don’t
Don’t Try
Try This
This with
with Objects
Objects
Be aware that the virtual function mechanism works only
with pointers to objects and, with references, not with objects
themselves.
int main(){
8
Square S(4);
Polymorphism
Cube C(8);
S.Area();
C.Area();
}
Calling virtual functions is a time-consuming process, because
of indirect call via tables. Don’t declare functions as virtual if
it is not necessary.
Object Oriented Programming 312
NotesHub.co.in | Download Android App
Warning
Homogeneous
Homogeneous Linked
Linked Lists
Lists and
and Polymorphism
Polymorphism
Most frequent use of polymorphism is on collections such as
linked list: class Square {
protected:
double edge;
8
public:
Polymorphism
Square(double e):edge(e){ }
virtual double area(){
area return( edge * edge ) ; }
Sqaure *next ;
};
class Cube : public Square {
public:
Cube(double e):Square(e){}
double area(){
area return( 6.0 * edge * edge ) ; }
};
Object Oriented Programming 314
NotesHub.co.in | Download Android App
int main(){
Circle c1(50);
Square s1(40);
Circle c2(23);
Square s2(78);
Square *listPtr; // Pointer of the linked list
8
c1.next=&s1;
s1.next=&c2;
c2.next=&s2;
s2.next=0L;
while (listPtr){ // Printing all elements of the list
cout << listPtr->Area() << endl ;
listPtr=listPtr->next;
}
}
Object Oriented Programming example27.cpp 315
NotesHub.co.in | Download Android App
Abstract
Abstract Classes
Classes
► To write polymorphic functions wee need to have derived classes.
But sometimes we don’t need to create any base class objects, but
only derived class objects. The base class exists only as a starting
point for deriving other classes.
8
► This kind of base classes we can call are called an abstract class,
Polymorphism
Pure
Pure Virtual
Virtual Classes
Classes
► It would be nice if, having decided to create an abstract base class, I
could instruct the compiler to actively prevent any class user from ever
making an object of that class. This would give me more freedom in
designing the base class because I wouldn’t need to plan for actual
8
objects of the class, but only for data and functions that would be used
Polymorphism
Example
Example in
in Visual
Visual C++
C++ 66
class CGenericShape{ // Abstract base class
protected:
int x,y;
CGenericShape *next ;
8
public:
Polymorphism
CGenericShape *nextShape)
Polymorphism
:CGenericShape(x_in,y_in,nextShape){
x2=x2_in;
y2=y2_in;
}
void draw(HDC hdc){ // virtual draw function
MoveToEx(hdc,x,y,(LPPOINT) NULL);
LineTo(hdc,x2,y2); }
};
Object Oriented Programming 321
NotesHub.co.in | Download Android App
:CLine(x_in,y_in,x2_in,y2_in,nextShape)
Polymorphism
{}
void draw(HDC hdc){// virtual draw
Rectangle(hdc,x,y,x2,y2);
}
};
CGenericShape *nextShape)
Polymorphism
:CGenericShape(x_cen,y_cen,nextShape)
{
radius=r;
}
void draw(HDC hdc) { // virtual draw
Ellipse(hdc,x-radius,y-radius,x+radius,y+radius);
}
};
Object Oriented Programming 323
NotesHub.co.in | Download Android App
while (p!=NULL){
p->draw(hdc); // It 's unknown at compile-time
p = ++*p ;
Sleep(100);
}
}
PAINTSTRUCT ps;
PolyDraw.dsw
HDC hdc;
CLine Line1(50,50,150,150,NULL);
CLine Line2(150,50,50,150,&Line1) ;
CCircle Circle1(100,100,20,&Line2);
8
CCircle Circle2(100,100,50,&Circle1);
Polymorphism
CRectangle Rectangle1(50,50,150,150,&Circle2);
switch (message) {
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps);
ShowShapes (Rectangle1,hdc);
EndPaint (hwnd, &ps);
return 0;
Object Oriented Programming 325
NotesHub.co.in | Download Android App
A
A Finite
Finite State
State Machine
Machine (FSM)
(FSM) Example
Example
State :{1, 2,3}
Input : { a, b }, x to exit
Output : { x , y }
8
a/y b/y
Polymorphism
b/x
1 2
a/y a/x
b/x States of the FSM are defined using
3
a class structure.
Each state is derived from the same
base class.
Object Oriented Programming 326
NotesHub.co.in | Download Android App
class State{ // Base State (Abstract Class)
protected:
State * const next_a, * const next_b; // Pointers to next state
char output;
public:
State(State & a, State & b):next_a(&a), next_b(&b) { }
virtual State* transition(char)=0; // pure virtual function
};
8
{
Polymorphism
switch(input){
case 'a': output = 'y';
return next_a;
case 'b': output = 'x';
return next_b;
default : cout << endl << "Undefined input";
cout << endl << "Next State: Unchanged";
return this;
}
}
Object Oriented Programming 328
NotesHub.co.in | Download Android App
The FSM in our example has three states.
class FSM{ // Finite State Machine
State1 s1;
State2 s2;
State3 s3;
State *current; // points to the current state
public:
FSM() : s1(s1,s2), s2(s3,s2), s3(s1,s2), current(&s1) { } //Starting state is State1
8
void run();
};
Polymorphism
void FSM::run() {
char in;
do {
cout << endl << "Give the input value (a or b; x: EXIT) ";
cin >> in;
if (in != 'x')
current = current->transition(in); // Polymorphic function call
else
curent = 0; // EXIT
} while(current);
}
The transition function of the current state is called.
Return value of this function determines the next state of the FSM.
Object Oriented Programming 329
NotesHub.co.in | Download Android App
Virtual
Virtual Constructors?
Constructors?
►Can constructors be virtual?
No, they can’t be.
►When you’re creating an object, you usually already know
8
what kind of object you’re creating and can specify this to the
Polymorphism
Virtual
Virtual Destructors
Destructors
►Recall that a derived class object typically contains data
from both the base class and the derived class.
►To ensure that such data is properly disposed of, it may be
8
Virtual
Virtual Destructors
Destructors
class Base {
public:
~Base() { cout << "\nBase destructor"; }
};
8
public:
~Derv() { cout << "\nDerived destructor"; }
};
int main(){
Base pb = new Derived;
Base* ed
delete pb;
cout << endl << "Program terminates.“ << endl ;
}
Object Oriented Programming 332
NotesHub.co.in | Download Android App
Virtual
Virtual Destructors
Destructors
►But the output is
Base Destructor
Program terminates
►In this program bp is a pointer of Base type. So it can
point to objects of Base type and Derived type. In the
8
public:
~Derv() { cout << "\nDerived destructor"; }
};
int main(){
Base pb = new Derived;
Base* ed
delete pb;
cout << endl << "Program terminates.“ << endl ;
}
Object Oriented Programming 334
NotesHub.co.in | Download Android App
9 EXCEPTION
335
NotesHub.co.in | Download Android App
Program
Program Errors
Errors
►Kinds of errors with programs
– Poor logic - bad algorithm
– Improper syntax - bad implementation
9
Paradigm
Paradigm Shift
Shift from
from C
C
►In C, the default response to an error is to continue,
possibly generating a message
►In C++, the default response to an error is to terminate the
9
program
Exception
assert()
assert()
►a macro (processed by the precompiler)
– Returns TRUE if its parameter is TRUE
– Takes an action if it is FALSE
9
Exception
assert()
assert() (cont’d)
(cont’d)
►When writing your program, if you know something is true,
you can use an assert
►If you have a function which is passed a pointer, you can do
9
– assert(pTruck);
Exception
assert()
assert() (cont’d)
(cont’d)
►Assert is only used to find programming errors
►Runtime errors are handled with exceptions
– DEBUG false => no code generated for assert
9
assert()
assert() (cont’d)
(cont’d)
►assert() can be helpful
►Don’t overuse it
►Don’t forget that it “instruments” your code
9
Exceptions
Exceptions
►You can fix poor logic (code reviews, debugger)
►You can fix improper syntax (asserts, debugger)
►You have to live with exceptions
9
Why
Why are
are Exceptions
Exceptions Needed?
Needed?
►The types of problems which cause exceptions (running
out of resources, bad disk drive) are found at a low level
(say in a device driver)
9
How
How To
To Deal
Deal With
With Exceptions
Exceptions
►Crash the program
►Display a message and exit
►Display a message and allow the user to continue
9
user
What
What is
is aa C++
C++ Exception?
Exception?
►An object
– passed from the area where the problem occurs
– passed to the area where the problem is handled
9
Exception
Syntax
Syntax
try {
// a block of code which might generate an exception
}
catch(xNoDisk) {
9
// insert a disk)
}
catch(xNoMemory) {
// another exception handler for this “try block”
}
The
The Exception
Exception Class
Class
►Define like any other class:
class Set {
private:
9
int *pData;
Exception
public:
...
class xBadIndex {}; // just like any other class
};
Object Oriented Programming 347
NotesHub.co.in | Download Android App
Throwing
Throwing An
An Exception
Exception
►In your code where you reach an error node:
if(memberIndex < 0)
throw xBadIndex();
9
Exception
The
The Call
Call Stack
Stack
►As your program executes, and functions are called, the
return address for each function is stored on a push down
stack
►At runtime, the program uses the stack to return to the
9
calling function
Exception
Passing
Passing The
The Exception
Exception
►The exception is passed up the call stack until an
appropriate catch block is found
►As the exception is passed up, the destructors for objects
9
Handling
Handling The
The Exception
Exception
►Once an appropriate catch block is found, the code in the
catch block is executed
►Control is then given to the statement after the group of
9
catch blocks
Exception
Handling
Handling The
The Exception
Exception (cont’d)
(cont’d)
catch (Set::xBadIndex) {
// display an error message
}
9
catch (Set::xBadData) {
Exception
Default
Default catch
catch Specifications
Specifications
►Similar to the switch statement
catch (Set::xBadIndex)
{ // display an error message }
9
catch (Set::xBadData)
Exception
Exception
Exception Hierarchies
Hierarchies
► Exception classes are just like every other class; you can
derive classes from them
► So one try/catch block might catch all bad indices, and
9
xBadIndex
xNegative xTooLarge
Exception
Exception Hierarchies
Hierarchies (cont’d)
(cont’d)
class Set {
private:
int *pData;
public:
9
Data
Data in
in Exceptions
Exceptions
►Since Exceptions are just like other classes, they can have
data and member functions
►You can pass data along with the exception object
9
Data
Data in
in Exceptions
Exceptions (Continued)
(Continued)
// Add member data,ctor,dtor,accessor method
class xBadIndex {
private:
9
int badIndex;
Exception
public:
xBadIndex(int iType):badIndex(iType) {}
int GetBadIndex () { return badIndex; }
~xBadIndex() {}
};
Passing
Passing Data
Data In
In Exceptions
Exceptions
// the place in the code where the index is used
if (index < 0)
throw xBadIndex(index);
9
throw xBadIndex(index);
// index is ok
Getting
Getting Data
Data From
From Exceptions
Exceptions
catch (Set::xBadIndex &theException)
{
int badIndex = theException.GetBadIndex();
9
if (badIndex < 0 )
Exception
cout << “Set Index “ << badIndex << “ less than 0”;
else
cout << “Set Index “ << badIndex << “ too large”;
cout << endl;
}
Passing
Passing Data
Data In
In Exceptions
Exceptions
// the place in the code where the index is used
if (index < 0)
throw xNegative (index);
9
throw xTooLarge(index);
// index is ok
Getting
Getting Data
Data From
From Exceptions
Exceptions
catch (Set::xNegative &theException)
{
int badIndex = theException.GetBadIndex();
9
cout << “Set Index “ << badIndex << “ less than 0”;
Exception
Getting
Getting Data
Data From
From Exceptions
Exceptions
catch (Set::xTooLarge &theException)
{
int badIndex = theException.GetBadIndex();
9
Caution
Caution
►When you write an exception handler, stay aware of the
problem that caused it
►Example: if the exception handler is for an out of memory
9
Exceptions
Exceptions With
With Templates
Templates
►You can create a single exception for all instances of a
template
– declare the exception outside of the template
9
template
– declare the exception inside the template
Single
Single Template
Template Exception
Exception
class xSingleException {};
private:
Exception
T *pType;
public:
Set();
T& operator[] (int index) const;
};
Each
Each Template
Template Exception
Exception
template <class T>
class Set {
private:
9
T *pType;
public:
Exception
Catching
Catching Template
Template Exceptions
Exceptions
►Single Exception (declared outside the template class)
catch (xSingleException)
►Each Exception (declared inside the template class)
9
catch (Set<int>::xEachException)
Exception
Exception
Exception Specification
Specification
►A function that might throw an exception can warn its
users by specifying a list of the exceptions that it can
throw.
9
class Zerodivide{/*..*/};
Exception
Exception
Exception Specification
Specification
►Exception Specifications Are Enforced At Runtime
►When a function attempts to throw an exception that it is
not allowed to throw according to its exception
specification, the exception handling mechanism detects
9
unexpected().
unexpected()
►The default behavior of unexpected() is to call
terminate() which terminates the program.
terminate(),
►The default behavior can be altered, nonetheless, by using
the function set_unexpected().()
Exception
Exception Specification
Specification
►Because exception specifications are enforced only at
runtime, the compiler might deliberately ignore code that
seemingly violates exception specifications.
►Consider the following:
9
Exception
Concordance
Concordance of
of Exception
Exception Specification
Specification
C++ requires exception specification concordance in derived
classes. This means that an overriding virtual function in a
derived class has to have an exception specification that is at
least as restrictive as the exception specification of the
9
};
Exception
class D: public A {
public:
void f() throw (DerivedEx); //OK
void g() throw (OtherEx); //error
void h() throw (DerivedEx); //OK
void i() throw (BaseEx); //error
void j() throw (BaseEx,OtherEx); //error
};
Object Oriented Programming 372
NotesHub.co.in | Download Android App
Concordance
Concordance of
of Exception
Exception Specification
Specification
An exception could belong to two groups:
class Netfile_err : public Network_err,
Network_err public File_system_err {
/* ... */
};
9
void f(){
try {
/ / something
}
catch (Network_err& e) {
// ...
}
}
void g() {
try {
/ / something else
9
}
Exception
catch(File_system_err& e) {
/ / ...
}
}
Exception
Exception Matching
Matching
void f() {
try {
throw E() ;
}
catch(H) {
9
}
The handler is invoked:
[1] If H is the same type as E.
[2] If H is an unambiguous public base of E.
[3] If H and E are pointer types and [1] or [2] holds for the
types to which they refer.
[4] If H is a reference and [1] or [2] holds for the type to
which H refers.
Object Oriented Programming 375
NotesHub.co.in | Download Android App
Resource
Resource Management
Management
When a function acquires a resource – that is, it opens a file,
allocates some memory from the free store, sets an access
control lock, etc., – it is often essential for the future running
of the system that the resource be properly released.
9
Exception
Resource
Resource Management
Management
Fault-tolerant implementation using try-catch:
void use_ file(const char* fn)
{ void f(){
9
…
// use f use_file(“c:\\dat.txt”);
} …
catch (Ex e) { }
fclose(f) ; catch(SomeEx e){
throw e; }
} }
fclose(f) ;
}
Object Oriented Programming 377
NotesHub.co.in | Download Android App
Resource
Resource Management
Management
The problem with this solution is that it is verbose, tedious,
and potentially expensive.
class File_ptr {
FILE* p;
9
public:
Exception
Standard
Standard Exceptions
Exceptions
►The C++ standard includes some predefined exceptions,
in <stdexcept>
►The base class is exception
9
Standard
Standard Exceptions
Exceptions
class exception {
public:
exception() throw() ;
exception(const exception&) throw() ;
9
Logic
Logic Error
Error Hierarchy
Hierarchy
logic_error
9
Exception
Runtime
Runtime Error
Error Hierarchy
Hierarchy
runtime_error
9
Exception
Data
Data For
For Standard
Standard Exceptions
Exceptions
// standard exceptions allow you to specify
// string information
throw overflow_error(“Doing float division in function div”);
9
{
public:
overflow_error(const string& what_arg)
: runtime_error(what_arg) {};
Catching
Catching Standard
Standard Exceptions
Exceptions
catch (overflow_error)
{
cout << “Overflow error” << endl;
}
9
Exception
catch (exception& e)
{
cout << typeid(e).name() << “: “ << e.what() << endl;
}
More
More Standard
Standard Exception
Exception Data
Data
►catch (exception& e)
– Catches all classes derived from exception
– If the argument was of type exception, it would be
9
class
– The handler gets a reference to exception as an
argument, so it can look at the object
RTTI
RTTI (RunTime
(RunTime Type
Type Information)
Information)
► It's one of the more recent additions to C++ and isn't supported by
many older implementations. Other implementations may have
compiler settings for turning RTTI on and off.
► The intent of RTTI is to provide a standard way for a program to
9
What
What is
is RTTI
RTTI for?
for?
► Suppose you have a hierarchy of classes descended from a common
base. You can set a base class pointer to point to an object of any of
the classes in this hierarchy. Next, you call a function that, after
processing some information, selects one of these classes, creates an
9
object of that type, and returns its address, which gets assigned to a
base class pointer.
Exception
How
How does
does itit work?
work?
C++ has three components supporting RTTI:
► dynamic_cast pointer
generates a pointer to a derived type from a pointer to a base
type, if possible. Otherwise, the operator returns 0, the null
9
pointer.
► typeid operator
Exception
dynamic_cast<>
dynamic_cast<>
► The dynamic_cast operator is intended to be the most heavily used
RTTI component.
► It doesn't answer the question of what type of object a pointer
points to.
9
class Grand {
virtual void speak() ;
};
class Superb : public Grand {
for (int i = 0; i < 5; i++)
9
void speak() ;
{
Exception
►However, you can't use this exact approach to invoke the say()
ay
function; it's not defined for the Grand class.
►However, you can use the dynamic_cast operator to see if pg can
be type cast to a pointer to Superb.
►This will be true if the object is either type Superb or Magnificent.
In either case, you can invoke the say()
ay function safely:
9
Exception
typeid
typeid
►typeid is an operator which allows you to access the type of
an object at runtime
►This is useful for pointers to derived classes
►typeid overloads ==, !=, and defines a member function
9
name
Exception
if(typeid(*carType) == typeid(Ford))
cout << “This is a Ford” << endl;
typeid().name
typeid().name
cout << typeid(*carType).name() << endl;
// If we had said:
// carType = new Ford();
9
// Ford
► So:
cout << typeid(e).name()
returns the name of the exception
e.what()
e.what()
► The class exception has a member function what
virtual char* what();
► This is inherited by the derived classes
9
► what() returns the character string specified in the throw statement for
the exception
Exception
Deriving
Deriving New
New exception
exception Classes
Classes
class xBadIndex : public runtime_error {
public:
xBadIndex(const char *what_arg = “Bad Index”)
: runtime_error(what_arg) {}
9
};
Exception
public:
Exception
Array(void);
Array(int);
class eNegativeIndex{};
class eOutOfBounds{};
class eEmptyArray{};
T& operator[](int) ;
};
}
Exception
Array<int> a(10) ;
try{
int b = a[200] ;
}
catch(Array<int>::eEmptyArray){
9
}
catch(Array<int>::eNegativeIndex){
cout << "Negative Array" ;
}
catch(Array<int>::eOutOfBounds){
cout << "Out of bounds" ;
}
10 TEMPLATES
401
NotesHub.co.in | Download Android App
Kalıp-Parametrik
Kalıp-Parametrik Çok
Çok Şekillilik
Şekillilik Nedir?
Nedir?
Sınıflardaki fonksiyonların gövdeleri incelendiğinde, yapılan işlemler
çoğu zaman, üzerinde işlem yapılan verinin tipinden bağımsızdır. Bu
durumda fonksiyonun gövdesi, verinin tipi cinsinden, parametrik
olarak ifade edilebilir:
10
int abs(int n) {
Templates
return (n<0) ? -n : n;
}
long abs(long n) {
return (n<0) ? -n : n;
}
float abs(float n) {
return (n<0) ? -n : n;
}
Object Oriented Programming 402
NotesHub.co.in | Download Android App
►C
Her tip için farklı adlarda fonksiyonlar.
örnek mutlak değer fonksiyonları:
abs(), fabs(), fabsl(), labs(), cabs(), ...
10
► C++
Templates
Fonksiyon
Fonksiyon Kalıbı
Kalıbı Tanımlamak
Tanımlamak
template <class T>
inline T const& max (T const& a, T const& b){
return a<b?b:a;
}
10
int main(){
int i = 42;
Templates
max<double>(4,4.2) // Tamam
max(static_cast<double>(4),4.2) // Tamam
10
Templates
Örnek
Örnek
int main() {
int a[3]={1,2,3} ;
double b[5]={1.1,2.2,3.3,4.4,5.5} ;
char c[7]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’ , ‘f’, ‘g’} ;
10
Templates
printArray a,3)
printArray( ;
printArray b,5)
printArray( ;
printArray c,7)
printArray( ;
return 0 ;
}
void printArray(int
printArray *array,cont int size){
for(int i=0;i < size;i++)
cout << array[i] << " " ;
cout << endl ;
10
}
Templates
void printArray(char
printArray *array,cont int size){
for(int i=0;i < size;i++)
cout << array[i] << "" ;
cout << endl ;
}
template’in İşleyişi
template’in
template İşleyişi
Gerçekte derleyici template ile verilmiş fonksiyon gövdesi için
herhangi bir kod üretmez. Çünkü template ile bazı verilerin tipi
parametrik olarak ifade edilmiştir. Verinin tipi ancak bu fonksiyona
ilişkin bir çağrı olduğunda ortaya çıkacaktır. Derleyici her farklı tip
10
int intVar1 = 5;
template’in İşleyişi
template’in
template İşleyişi
►Programı ister template yapısı ile oluşturalım ister de template
yapısı olmaksızın oluşturalım, programın bellekte kaplayacağı alan
değişmeyecektir.
►Değişen, kaynak kodun boyu olacaktır. template yapısı
10
Template
Template Parametresi
Parametresi bir
bir Nesne
Nesne Olabilir
Olabilir
class TComplex { /* A class to define complex numbers */
float real,imag;
public:
: // other member functions
10
};
bool TComplex::operator>(const TComplex& z) const {
float norm1 = real * real + imag * imag;
float norm2 = z.real * z.real + z.imag * z.imag;
if (norm1 > norm2) return true;
else return false;
}
int main(){
int i1=5, i2= -3;
Templates
Çoklu
Çoklu template
template Parametreli
Parametreli Argümanlar
Argümanlar
if(array[j]==value) return j;
return -1;
Templates
int main()
{
10
cout << "\n 'f' in chrArray: index=" << find(chrArr, ch, 6);
cout << "\n 6 in intArray: index=" << find(intArr, in, 6);
Templates
}
char str1[100], str2[100] ;
Templates
int i,j ;
TComplex c1,c2;
swap( i , j ) ;
swap( c1 , c2 ) ;
swap( str1[50] , str2[50] ) ;
swap( i , str[25] ) ;
swap( str1 , str2 ) ; hata
Object Oriented Programming 415
NotesHub.co.in | Download Android App
strcpy(s1,s2);
Templates
strcpy(s2,temp);
delete []temp;
}
Tipsiz
Tipsiz Template
Template Parametreleri
Parametreleri
template <typename T, int VAL>
T addValue (T const& x) {
return x + VAL;
}
10
İşlev
İşlev Yüklemede
Yüklemede Eşleme
Eşleme Önceliği
Önceliği
► Kalıp dışında aynı imzaya sahip fonksiyon
► Kalıp ile tanımlanmış aynı imzaya sahip fonksiyon
char str1[100], str2[100] ;
10
...
swap( str1 , str2 ) ;
Templates
Çoklu
Çoklu template
template Parametreli
Parametreli Yapılar
Yapılar
►Template parametre sayısı birden fazla olabilir:
template <class atype, class btype>
btype find(const atype* array, atype value, btype size) {
for (btype j=0; j<size; j++)
10
if(array[j]==value) return j;
return (btype)-1;
Templates
}
►Bu durumda, derleyici sadece farklı dizi tipleri için değil aynı
zamanda aranan elemanın farklı tipte olması durumunda da farklı bir
kod üretecektir:
short int result,si=100;
int invalue=5;
result = find(intArr, invalue,si) ;
Sınıf
Sınıf template
template Yapısı
Yapısı
class Stack {
int st[MAX]; // array of ints
int top; // index number of top of stack
public:
Stack(); // constructor
10
};
class LongStack {
long st[MAX]; // array of longs
int top; // index number of top of stack
public:
LongStack(); // constructor
void push(long var); // takes long as argument
long pop(); // returns long value
};
Object Oriented Programming 420
NotesHub.co.in | Download Android App
};
template<class Type>
void Stack<Type>::push(Type var) // put number on stack
{
if(top > maxSize-1) // if stack full,
throw "Stack is full!"; // throw exception
st[top++] = var;
}
Sınıf
Sınıf template
template Yapısının
Yapısının Farkı
Farkı
►Template fonksiyonları için template parametresinin ne
olacağını derleyici çağrı yapılan fonksiyon için imzaya
bakarak karar verir.
►Template sınıflar için tanımlandığında template
10
Neler
Neler Template
Template Parametresi
Parametresi Olamaz?
Olamaz?
int main() {
Templates
Static
Static Polymorphism×Dynamic
Polymorphism×Dynamic Polymorphism
Polymorphism
►Run-time Polymorphism vs. Compile-time Polymorphism
►Run-time Polymorphism:
– Inheritance & virtual functions
10
►Compile-time Polymorphism
Templates
– templates
…
};
class Line : public GeoObj {
public:
virtual void draw() const;
virtual Coord center_of_gravity() const;
…
};
Object Oriented Programming 426
NotesHub.co.in | Download Android App
Run-time Polymorphism
void myDraw (GeoObj const& obj)
{
obj.draw();
}
10
int main()
Templates
{
Line l;
Circle c, c1, c2;
…
};
Templates
Compile-time Polymorphism
template <typename GeoObj>
void myDraw (GeoObj const& obj)
{
obj.draw();
}
10
Templates
int main()
{
Line l;
Circle c, c1, c2;
myDraw(l); // myDraw<Line>(GeoObj&)=>Line::draw()
myDraw(c); // myDraw<Circle>(GeoObj&)=>Circle::draw()
Advantages
Advantages &
& Disadvantages
Disadvantages
Dynamic polymorphism in C++:
►Heterogeneous collections are handled elegantly.
►The executable code size is potentially smaller (because
10
types).
►Code can be entirely compiled; hence no implementation
source must be published (distributing template libraries
usually requires distribution of the source code of the
template implementations).
Advantages
Advantages &
& Disadvantages
Disadvantages
In contrast, the following can be said about static
polymorphism in C++:
►Collections of built-in types are easily implemented. More
generally, the interface commonality need not be
10
New
New Approaches–Design
Approaches–Design Patterns
Patterns
►A Design Pattern
– “Bridge Pattern”
► Inheritance based implementation
10
Templates
New
New Approaches–Design
Approaches–Design Patterns
Patterns
►Implementation with template
10
Templates
Generic Programming
11 (with STL in C++)
434
NotesHub.co.in | Download Android App
Standard
Standard Template
Template Library
Library
Nesneye dayalı programlamada, verinin birincil öneme sahip
programlama birimi olduğunu belirtmiştik. Veri, fiziksel yada soyut bir
Generic Programming 11
Generic
Generic Programming
Programming
Bir yazılım ürününün bileşenlerini, üç boyutlu uzayda bir nokta
olarak düşünebiliriz :
Generic Programming 11
k
(sıralama,int,array)
veri tipi : int, float, ...
(sıralama,double,list)
(sıralama,int,list)
... template j
(sıralama,array) kap :
(sıralama,list) dizi, liste, kuyruk ...
algoritma :
... generic prog. i sıralama, kaynaştırma, arama ...
(sıralama)
STL
STL Bileşenleri
Bileşenleri
STL üç temel bileşenden oluşmaktadır:
• Algoritma,
Generic Programming 11
Algoritma
• Kap (Container): nesneleri depolamak ve yönetmekten
sorumlu nesne,
• Lineer Kaplar : Vector, Deque, List
• Asosyatif Kaplar : Set, Map, Multi-set, Multi-map
• Yineleyici (Iterator): algoritmanın farklı tipte kaplarla
çalışmasını sağlayacak şekilde erişimin soyutlar.
Kaplar
Kaplar
düşünülebilir. deque kabı her iki uçtan veri eklemeye ve silmeye olanak sağlamaktadır.
Vector Relocating,
expandable array Quick random access (by index number).
Slow to insert or erase in the middle.
Quick to insert or erase at end.
Vector
Vector
►#include <vector>
►Kurucular
Generic Programming 11
Vector
Vector Member
Member Functions
Functions
► Type &vector::back(): returns the reference to the last element
► Type &vector::front():returns the reference to the first element
Generic Programming 11
► vector::iterator vector::begin()
► vector::iterator vector::end()
► vector::clear()
► bool vector::empty()
► vector::iterator vector::erase()
– erase(pos)
– erase(first,beyond)
Vector
Vector Member
Member Functions
Functions
► vector::insert
– vector::iterator insert(pos)
– vector::iterator insert(pos,value)
Generic Programming 11
– vector::iterator insert(pos,first,beyond)
– vector::iterator insert(pos,n,value)
► void vector::pop_back()
► void vector::push_back(value)
► vector::resize()
– resize(n,value)
► vector::swap()
– vector<int> v1(7),v2(10) ;
– v1.swap(v2);
► unsigned vector::size()
Örnek
Örnek
vector<int> v;
cout << v.capacity() << v.size() ;
Generic Programming 11
v.insert(v.end(),3) ; v = (3)
cout << v.capacity() << v.size() ;
v.insert (v.begin(), 2, 5); v = (5,5,3)
w.erase(w.begin()); w = (5,3)
w.erase(w.begin(),w.end()) ;
cout << w.empty() ? “Empty” : “not Empty” Empty
Object Oriented Programming 444
NotesHub.co.in | Download Android App
#define __USE_STL
// STL include files
Generic Programming 11
#include <vector>
#include <list>
vector<int> v;
v.insert(v.end(),3) ; v = (3)
v.insert(v.begin(),5) ; v = (5,3)
cout << v.front() << endl; 5
cout << v.back() ; 3
v.pop_back();
cout << v.back() ; 5
List
List
► #include <list>
► Eklenecek eleman sayısı belirli olmadığı durumlarda uygundur
Generic Programming 11
► Kurucular
– Boş: list<string> object;
– Belirli sayıda eleman:
• list<string> object(5,string(“hello”)) ;
• list<string> container(10)
• list<string> object(&container[5], &container[9]);
• list<string> object(container) ;
List
List Member
Member Functions
Functions
► Type &list::back(): returns the reference to the last element
► Type &list::front():returns the reference to the first element
Generic Programming 11
► list::iterator list::begin()
► list::iterator list::end()
► list::clear()
► bool list::empty()
► list::iterator list::erase()
– erase(pos)
– erase(first,beyond)
List
List Member
Member Functions
Functions
► list::insert
– list::iterator insert(pos)
– list::iterator insert(pos,value)
Generic Programming 11
– list::iterator insert(pos,first,beyond)
– list::iterator insert(pos,n,value)
► void list::pop_back()
► void list::push_back(value)
► list::resize()
– resize(n,value)
► void list<type>::merge(list<type> other)
► void list<type>::remove(value)
► unsigned list::size() list1.cpp
list2.cpp
List
List Member
Member Functions
Functions
► list::sort()
► void list::splice(pos,object) list3.cpp
Generic Programming 11
Queue
Queue
►#include <queue>
►FIFO (=First In First Out)
Generic Programming 11
►Kurucular
– Boş: queue<string> object;
– Kopya Kurucu: queue<string> object(container) ;
Queue
Queue Member
Member Functions
Functions
►Type &queue::back(): returns the reference to the last
element
Generic Programming 11
Priority_Queue
Priority_Queue
►#include <queue>
►Temel olarak queue ile aynı
Generic Programming 11
priqueue1.cpp
priqueue2.cpp
Priority_Queue
Priority_Queue Member
Member Functions
Functions
►Type &queu::back(): returns the reference to the last
element
Generic Programming 11
Deque
Deque
►#include <deque>
►Head &Tail, Doubly Linked
Generic Programming 11
►deque<string> object
• deque<string> object(5,string(“hello”)) ;
• deque<string> container(10)
• deque<string> object(&container[5], &container[9]);
• deque<string> object(container) ;
Deque
Deque Member
Member Functions
Functions
► Type &deque::back(): returns the reference to the last element
► Type &deque::front():returns the reference to the first element
Generic Programming 11
► deque::iterator deque::begin()
► deque::iterator deque::end()
► deque::clear()
► bool deque::empty()
► deque::iterator deque::erase()
– erase(pos)
– erase(first,beyond)
Deque
Deque Member
Member Functions
Functions
► vector::insert
– deque::iterator insert(pos)
Generic Programming 11
– deque::iterator insert(pos,value)
– deque::iterator insert(pos,first,beyond)
– deque::iterator insert(pos,n,value)
► void deque::pop_back()
► void deque::push_back(value)
► deque::resize()
– resize(n,value)
► deque::swap()
► unsigned deque::size()
Asosyatif
Asosyatif Kaplar:
Kaplar: Set,
Set, Multiset,
Multiset, Map,
Map, Multimap
Multimap
► Set sıralı küme oluşturmak için kullanılır.
#include <set>
Generic Programming 11
Map
Map
► #include <map>
► Key/Value pairs
Generic Programming 11
► map<string,int> object
• pair<string,int>
pa[]= {
pair<string,int>(“one”,1),
pair<string,int>(“two”,2),
pair<string,int>(“three”,3),
pair<string,int>(“four”,4)
};
• map<string,int> object(&pa[0],&pa[3]);
► object[“two”]
Map
Map Member
Member Functions
Functions
► map::insert
– pair<map::iterator,bool> insert(keyvalue)
Generic Programming 11
– pair<map::iterator,bool> insert(pos,keyvalue)
– void insert(first,beyond)
► map::iterator map::lower_bound(key)
► map::iterator map::upper_bound(key)
► pair<map::iterator,map::iterator> map::equal_range(key)
► map::iterator map::find(key)
– returns map::end() if not found
► unsigned deque::size()
Map
Map Member
Member Functions
Functions
►map::iterator map::begin()
►map::iterator map::end()
Generic Programming 11
►map::clear()
►bool map::empty()
►map::iterator map::erase()
– erase(keyvalue)
– erase(pos)
– erase(first,beyond)
int main(){
Örnek
Örnek
map<string,int> city_num;
city_num["Trabzon"]=61;
Generic Programming 11
...
string city_name;
cout << "\nEnter a city: ";
cin >> city_name;
if (city_num.end()== city_num.find(city_name))
cout << city_name << " is not in the database" << endl;
else
cout << "Number of " << city_name << ": " << city_num[city_name];
}
Object Oriented Programming 464
NotesHub.co.in | Download Android App
MultiMap
MultiMap
►#include <map>
►Main difference between map and multimap is that the
Generic Programming 11
Özetçe
Özetçe
İ ş le m Y ü r ü tü le n İ ş le m
a.size() a.end() – a.begin()
Generic Programming 11
a.max_size()
a.empty() a.size() == 0
U
Uyygguullaannaabbiillddiiğğii
İİşşlleem
m D
Döönnüüşş D
Deeğğeerrii Y
Yüürrüüttüülleenn İİşşlleem
m K
Kaappllaarr
a.front() T& *a.begin() vector, list, deque
a.back() T& *a.end() vector, list, deque
a.push_front(x) void a.insert(a.begin(),x) list,deque
a.push_back(x) void a.insert(a.end(),x) vector, list,deque
a.pop_front() void a.erase(a.begin()) list,deque
a.pop_back() void a.erase(--a.end()) list,deque
a[n] T& *(a.begin()+n) vector,deque
Iterators
Iterators
Iterators : Genelleştirilmiş İşaretçi
Generic Programming 11
OutputIterator r;
InputIterator r; INPUT OUTPUT
Iterators Iterators
ForwardIterator r;
BidirectionalIterator r;
RandomIterator r ;
Iterator
Iterator Capability
Capability
Output
Output Iterators
Iterators
n OutputIterator a ; p OutputIterator r ;
Generic Programming 11
… …
*a=t ; r++ ;
t = *a ; Hata r++ ; Hata
Forward
Forward and
and Bidirectional
Bidirectional Iterators
Iterators
range[v.begin(),v.end()]
list<int> l (1,1) ;
l.push_back(2) ; // list l : 1 2
list<int>::iterator first=l.begin() ;
list<int>::iterator last=l.end() ;
while( last != first){
-- last ;
cout << *last << “ ” ;
}
Object Oriented Programming 470
NotesHub.co.in | Download Android App
vector<int> v(3,1) ;
v.push_back(7); // vector : 1 1 1 7
vector<int>::iterator i=find_linear(v.begin(), v.end(),7) ;
if(i != v.end() ) cout << *i ;
else cout << “not found!” ;
Bubble
Bubble Sort
Sort
template<class Compare>
void bubble_sort(BidirectionalIterator first,
BidirectionalIterator last, Compare comp){
Generic Programming 11
Random
Random Access
Access Iterators
Iterators
vector<int> v(1,1) ;
v.push_back(2) ; v.push_back(3) ; v.push_back(4) ; // v : 1 2 3 4
vector<int>::iterator i=v.begin() ;
Generic Programming 11
vector<int>::iterator j=i+2;
cout << *j << “ ” ;
i += 3 ; cout << *i << “” ;
j = i – 1 ; cout << *j << “” ;
j -= 2 ; cout << *j << “” ;
cout << v[1] << endl ;
(j<i) ? cout << “j < i” : cout << “not j < i” ; cout << endl ;
(j>i) ? cout << “j > i” : cout << “not j > i” ; cout << endl ;
(j>=i) && (j<=i)? cout << “j and i equal” : cout << “j and i not equal > i” ; cout <<
endl ;
i=j;
j= v.begin();
i = v.end ;
cout << “iterator distance end – begin : ” << (i-j) ;
Object Oriented Programming 473
NotesHub.co.in | Download Android App
Iterator
Iterator Operators
Operators
►STL provides two functions that return the number of
elements between two elements and that jump from one
Generic Programming 11
distance()
distance()
►The distance() function finds the distance between the
current position of two iterators.
template<class RandomAccessIterator>
Generic Programming 11
iterator_traits<RandomAccessIterator>::difference_type
distance(RandomAccessIterator first, RandomAccessIterator
last) {
return last – first;
}
template<class InputIterator>
iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last) {
iterator_traits<InputIterator>::difference_type n = 0;
while (first++ != last) ++n;
return n;
}
Object Oriented Programming 475
NotesHub.co.in | Download Android App
advance()
advance()
►So far, we have seen how we can move iterators forward
and backward by using the increment and decrement
Generic Programming 11
Designing
Designing Generic
Generic Algorithm
Algorithm
Generic Programming 11
Binary
Binary Search
Search for
for Integer
Integer Array
Array
while( lo != hi ) {
mid = lo + (hi-lo)/2 ;
if( x == *mid ) return mid ;
if( x < *mid ) hi = mid ;
else lo = mid + 1 ;
}
return 0 ;
}
Binary
Binary Search─Template
Search─Template Solution
Solution (Form-1)
(Form-1)
template<class T>
const T * binary_search(const T * array, int n, T& x){
Generic Programming 11
Binary
Binary Search─Template
Search─Template Solution
Solution (Form-2)
(Form-2)
template<class T>
const T * binary_search(T * first,T * last, T& x){
Generic Programming 11
Generic
Generic Binary
Binary Search
Search
template<class RandomAccessIterator,class T>
const T * binary_search(RandomAccessIterator first,
Generic Programming 11
STL
STL Algorithms
Algorithms
Algorithm Purpose
find Returns first element equivalent to a specified value
#include <algorithm>
find()
find()
►The find() algorithm looks for the first element in a
container that has a specified value.
Generic Programming 11
Example
Example
#include <iostream>
#include <algorithm> //for find()
Generic Programming 11
count()
count()
►count() counts how many elements in a container have a
specified value and returns this number.
Generic Programming 11
#include <iostream>
#include <algorithm> //for count()
int arr[] = { 33, 22, 33, 44, 33, 55, 66, 77 };
int main(){
int n = count(arr, arr+8, 33); //count number of 33’s
cout << “There are “ << n << ” 33’s in arr.” << endl;
return 0;
}
count_if()
count_if()
►size_t count_if(InputIterator first, InputIterator last,
Predicate predicate)
Generic Programming 11
#include <vector>
#include <algorithm> //for count_if()
int a[] = { 1, 2, 3, 4, 3, 4, 2, 1, 3 };
class Odd {
public:
bool operator()(int val){ return val&1 ; }
};
int main(){
std::vector<int> iv(a,a+9) ;
std::cout << count_if(iv.begin(),iv.end(),Odd()) ;
return 0 ;
}
Object Oriented Programming 487
NotesHub.co.in | Download Android App
equal()
equal()
►bool equal(InputIterator first, InputIterator last,
InputIterator otherFirst)
Generic Programming 11
class CaseString {
public:
bool operator()(string const &first,string const &second){
return !strcasecmp(first.c_str(),second.c_str()) ;
Generic Programming 11
}
};
int main(){
string
first[]={"Alpha","bravo","Charley","echo","Delta","golf"},
second[]={"alpha","Bravo","charley","Echo","delta","Golf"} ;
std::string *last = first + sizeof(first)/sizeof(std::string) ;
cout << (equal(first,last,second)?"Equal":"Not equal") ;
cout << (equal(first,last,second,CaseString())?"Equal":
"Not equal") ;
return 0 ;
}
Object Oriented Programming 489
NotesHub.co.in | Download Android App
fill(),fill_n()
fill(),fill_n()
►void fill(ForwardIterator first,ForwardIterator last,
Type const &value)
Generic Programming 11
vector<int> iv(8) ;
fill(iv.begin(),iv.end(),8) ;
vector<int> iv(8) ;
fill_n(iv.begin()+2,4,8) ;
sort()
sort()
►You can guess what the sort() algorithm does.
Here’s an example:
Generic Programming 11
#include <iostream>
#include <algorithm>
int arr[] = {45, 2, 22, -17, 0, -30, 25, 55};
int main(){
sort(arr, arr+8); //sort the numbers
for(int j=0; j<8; j++) //display sorted array
cout << arr[j] << ‘ ‘;
return 0;
}
Object Oriented Programming 491
NotesHub.co.in | Download Android App
search()
search()
► Some algorithms operate on two containers at once. For instance,
while the find() algorithm looks for a specified value in a single
container, the search() algorithm looks for a sequence of values,
Generic Programming 11
int source[] = { 11, 44, 33, 11, 22, 33, 11, 22, 44 };
int pattern[] = { 11, 22, 33 };
int main(){
int* ptr;
ptr = search(source, source+9, pattern, pattern+3);
if(ptr == source+9) cout << “No match found\n”;
else cout << “Match at ” << (ptr - source) ;
return 0;
}
Object Oriented Programming 492
NotesHub.co.in | Download Android App
binary_search()
binary_search()
► #include <algorithm>
– bool binary_search(ForwardIterator first, ForwardIterator last,Type const
&value)
Generic Programming 11
merge()
merge()
#include <iostream>
#include <algorithm> //for merge()
Generic Programming 11
accumulate()
accumulate()
► #include <numeric>
– Type accumulate(InputIterator first, InputIterator last,Type init)
operator+() is applied to all elements and the result is returned
Generic Programming 11
#include <iostream>
#include <numeric>
#include <vector>
Generic Programming 11
int main(){
int ia[]={1,2,3,4} ;
std::vector<int> iv(ia,ia+4) ;
adjacent_difference()
adjacent_difference()
► #include <numeric>
– OutputIterator adjacent_difference(InputIterator first, InputIterator
last,OutputOperator result)
Generic Programming 11
#include <iostream>
#include <numeric>
#include <vector>
int main(){
int ia[]={1,3,7,23} ;
Generic Programming 11
std::vector<int> iv(ia,ia+4) ;
std::vector<int> ov(iv.size()) ;
adjacent_difference(iv.begin(),iv.end(),ov.begin()) ;
copy(ov.begin(),ov.end(),std::ostream_iterator<int>(cout," ")) ;
std::cout << std::endl ;
adjacent_difference(iv.begin(),iv.end(),ov.begin(),minus<int>()) ;
copy(ov.begin(),ov.end(),ostream_iterator<int>(cout," ")) ;
system("pause") ;
return 0 ;
}
Object Oriented Programming 498
NotesHub.co.in | Download Android App
copy(),
copy(), copy_backward()
copy_backward()
► #include <algorithm>
– OutputIterator copy(InputIterator first, InputIterator last,
OutputIterator destination)
Generic Programming 11
for_each
for_each
►Function for_each(ForwardIterator first,
ForwardIterator last,Function func)
Generic Programming 11
tmp[0] = toupper(*tmp) ;
std::cout << tmp << " " ;
delete []tmp; foreach1.cpp
}
Object Oriented Programming 500
NotesHub.co.in | Download Android App
int main(){
std::string
sarr[] =
{
Generic Programming 11
Another
Another Example
Example
class Show{
int d_count ;
public:
Generic Programming 11
int main(){
std::string
sarr[] = {
Generic Programming 11
transform()
transform()
int _3_n_plus_1(int n) { void show(int n) {
return (n&1) ? 3*n+1 : n/2 ; std::cout << n << " " ;
Generic Programming 11
} }
int main(){
int iArr[] = { 5,2,23,76,33,44} ;
std::for_each(iArr,iArr+6,show) ; std::cout << std::endl ;
std::transform(iArr,iArr+6,iArr,_3_n_plus_1) ;
std::for_each(iArr,iArr+6,show) ;
system("pause") ;
return 0 ;
}
transform.cpp
Predicates
Predicates in
in <functional>
<functional>
►When the type of the return value of a unary function
object is bool, the function is called a unary predicate. A
Generic Programming 11
template<class T>
class equal_to : binary_function<T, T, bool> {
bool operator()(T& arg1, T& arg2) const { return arg1 == arg2; }
};
12 STREAMS
507
NotesHub.co.in | Download Android App
Streams
Streams
►A stream is a general name given to a flow of data in an
input/output situation. For this reason, streams in C++ are
often called iostreams.
iostreams
►An iostream can be represented by an object of a
Streams 12
particular class.
►For example, you’ve already seen numerous examples of
the cin and cout stream objects used for input and output.
Advantages
Advantages of
of Streams
Streams
►Old-fashioned C programmers may wonder what advantages there
are to using the stream classes for I/O instead of traditional C
functions such as printf() and scanf() and—for files—fprintf(),
fscanf(), and so on.
Streams 12
►One reason is that the stream classes are less prone to errors. If
you’ve ever used a %d formatting character when you should have
used a %f in printf(), you’ll appreciate this. There are no such
formatting characters in streams, because each object already knows
how to display itself. This removes a major source of program bugs.
►Second, you can overload existing operators and functions, such as
the insertion (<<) and extraction (>>) operators, to work with classes
you create. This makes your classes work in the same way as the
built-in types, which again makes programming easier and more error
free (not to mention more aesthetically satisfying).
Object Oriented Programming 509
NotesHub.co.in | Download Android App
Stream
Stream Class
Class Hierarchy
Hierarchy
ios
Streams 12
fstream
Stream
Stream Class
Class Hierarchy
Hierarchy
►The ios class is the base class for the iostream hierarchy.
–contains many constants and member functions common
to input and output operations of all kinds.
Streams 12
Stream
Stream Class
Class Hierarchy
Hierarchy
►The istream and ostream classes are derived from ios and
are dedicated to input and output, respectively.
►The istream class contains such member functions as
get(), getline(), read(), and the extraction (») operators,
Streams 12
Stream
Stream Class
Class Hierarchy
Hierarchy
►The ifstream class is used for creating input file objects
►The ofstream class is used for creating input file objects
is used for creating output file objects.
►To create a read/write file the fstream class should be
Streams 12
used.
ios
ios
►The ios class is the grand daddy of all the stream classes
and contains the majority of the features you need to operate
C++ streams.
►The three most important features are
Streams 12
Formatting
Formatting Flags
Flags
Formatting flags are a set of enum definitions in ios. They act as on/off
switches that specify choices for various aspects of input and output
format and operation.
skipws Skip (ignore) whitespace on input.
left Left adjust output.
Streams 12
Formatting
Formatting Flags
Flags
►There are several ways to set the formatting flags, and
different flags can be set in different ways. Because they are
members of the ios class, flags must usually be preceded by
the name ios and the scope-resolution operator (e.g.,
Streams 12
Manipulators
Manipulators
►Manipulators are formatting instructions inserted directly
into a stream.
►You’ve seen examples before, such as the manipulator
endl which sends a new line to the stream and flushes it:
endl,
Streams 12
No-argument
No-argument ios
ios Manipulators
Manipulators
ws Turn on whitespace skipping on input
dec Convert to decimal
oct Convert to octal
hex Convert to hexadecimal
Streams 12
ios
ios Manipulators
Manipulators with
with Arguments
Arguments
►Manipulators that take arguments affect only the next item
in the stream.
►For example, if you use setw to set the width of the field in
which one number is displayed, you’ll need to use it again for
Streams 12
Functions
Functions
►The ios class contains a number of functions that you can
use to set the formatting flags and perform other tasks.
►Most of these functions are shown below:
Return the fill character (fills unused part of
ch=fill()
Streams 12
►These functions are called for specific stream objects using the
normal dot operator. For example, to set the field width to 14, you can
say
cout.width(14);
►Similarly, the following statement sets the fill character to an asterisk
Streams 12
istream
istream
The istream class, which is derived from ios, performs input-
specific activities.
istream functions:
Formatted extraction for all basic (and overloaded) types.
Streams 12
>>
get(ch) Extract one character into ch.
get(str) Extract characters into array str, until ‘\0’.
get(str, MAX) Extract up to MAX characters into array.
get(str, DELIM) Extract characters into array str until specified delimiter
(typically ‘\n’).
Leave delimiting char in stream.
istream Functions
istream Functions
Extract characters into array str until MAX characters or
get(str, MAX, DELIM)
the DELIM character. Leave delimiting char in stream
Extract characters into array str until MAX characters or
getline(str, MAX, DELIM)
the DELIM character. Extract delimiting character
putback(ch) Insert last character read back into input stream
Streams 12
ostream
ostream
The ostream class handles output or insertion activities.
ostream functions:
<< Formatted insertion for all basic (and overloaded) types.
put(ch) Insert character ch into stream.
flush() Flush buffer contents and insert new line.
Streams 12
write(str, SIZE) Insert SIZE characters from array str into file.
seekp(position) Sets distance in bytes of file pointer from start of file.
seekp(position, seek_dir) Set distance in bytes of file pointer from specified place in
file. seek_dir can be ios::beg, ios::cur, or ios::end.
position = tellp() Return position of file pointer, in bytes.
Ostream
Ostream and
and _withassign
_withassign Classes
Classes
►The iostream class, which is derived from both istream and
ostream, acts only as a base class from which other classes,
specifically iostream_withassign, can be derived.
►It has no functions of its own (except constructors and destructors).
Classes derived from iostream can perform both input and output.
Streams 12
The cerr object is often used for error messages and program diagnostics. Output
Streams 12
sent to cerr is displayed immediately, rather than being buffered, as output sent
to cout is. Also, output to cerr cannot be redirected. For these reasons, you have
a better chance of seeing a final output message from cerr if your program dies
prematurely. Another object, clog, is similar to cerr in that it is not redirected,
but its output is buffered, whereas cerr’s is not.
Stream Errors
What happens if a user enters the string “nine” instead of the integer 9, or pushes
ENTER without entering anything? What happens if there’s a hardware failure?
We’ll explore such problems in this session. Many of the techniques you’ll see here
are applicable to file I/O as well.
Error-Status
Error-Status Bits
Bits
The stream error-status bits (error byte) are an ios member that report errors
that occurred in an input or output operation.
goodbit No errors (no bits set, value = 0).
eofbit Reached end of file.
failbit Operation failed (user error, premature EOF).
badbit Invalid operation (no associated streambuf).
Streams 12
Various ios functions can be used to read (and even set) these error bits.
int = eof(); Returns true if EOF bit set.
int = fail(); Returns true if fail bit or bad bit or hard-fail bit set.
int = bad(); Returns true if bad bit or hard-fail bit set.
int = good(); Returns true if everything OK; no bits set.
clear(int=0); With no argument, clears all error bits;
otherwise sets specified bits, as in clear(ios::failbit).
No-Input
No-Input Input
Input
►Whitespace characters, such as TAB, ENTER , and ‘\n’, are normally
ignored (skipped) when inputting numbers. This can have some
undesirable side effects. For example, users, prompted to enter a number,
may simply press the key without typing any digits. Pressing ENTER
causes the cursor to drop down to the next line while the stream continues
Streams 12
// no error
}
// error
Now if the user types without any digits, failbit will be set and an
error will be generated. The program can then tell the user what to
do or reposition the cursor so the screen does not scroll.
Disk
Disk File
File I/O
I/O with
with Streams
Streams
► Disk files require a different set of classes than files used with the
keyboard and screen. These are ifstream for input, fstream for input and
output, and ofstream for output. Objects of these classes can be
associated with disk files and you can use their member functions to
Streams 12
Here the program defines an object called outfile to be a member of the ofstream class.
At the same time, it initializes the object to the file name FDATA.TXT. This
initialization sets aside various resources for the file, and accesses or opens the file of
that name on the disk. If the file doesn’t exist, it is created. If it does exist, it is truncated
and the new data replaces the old. The outfile object acts much as cout did in previous
programs, so the insertion operator (<<) is used to output variables of any basic type to
the file. This works because the insertion operator is appropriately overloaded in
ostream, from which ofstream is derived.
Streams 12
When the program terminates, the outfile object goes out of scope. This calls its
destructor, which closes the file, so you don’t need to close the file explicitly.
You must separate numbers (such as 77 and 6.02) with nonnumeric characters. Because
numbers are stored as a sequence of characters rather than as a fixed-length field, this is
the only way the extraction operator will know, when the data is read back from the file,
where one number stops and the next one begins. Second, strings must be separated with
whitespace for the same reason. This implies that strings cannot contain embedded
blanks. In this example, I use the space character (“ “) for both kinds of delimiters.
Characters need no delimiters, because they have a fixed length.
Reading
Reading Data
Data
Any program can read the file generated by previous program by using
an ifstream object that is initialized to the name of the file. The file is
automatically opened when the object is created. The program can then
read from it using the extraction (>>) operator.
Streams 12
char str1[MAX];
char str2[MAX];
ifstream infile("fdata.txt"); // create ifstream object
infile >> ch >> j >> d >> str1 >> str2; // extract data from it
cout << ch << endl // display the data
<< j << endl
<< d << endl
<< str1 << endl
<< str2 << endl;
}
Object Oriented Programming 535
NotesHub.co.in | Download Android App
Detecting
Detecting End-OF-File
End-OF-File
► Objects derived from ios contain error-status bits that can be
checked to determine the results of operations. When you read a file
little by little, you will eventually encounter an end-of-file condition.
The EOF is a signal sent to the program from the hardware when there
Streams 12
Binary
Binary I/O
I/O
You can write a few numbers to disk using formatted I/O, but if you’re storing
a large amount of numerical data, it’s more efficient to use binary I/O in which
numbers are stored as they are in the computer’s RAM memory rather than as
strings of characters. In binary I/O an integer is always stored in 2 bytes,
whereas its text version might be 12345, requiring 5 bytes. Similarly, a float is
always stored in 4 bytes, whereas its formatted version might be 6.02314e13,
Streams 12
requiring 10 bytes.
The next example shows how an array of integers is written to disk and then
read back into memory using binary format. I use two new functions: write(),
a member of ofstream, and read(), a member of ifstream. These functions
think about data in terms of bytes (type char). They don’t care how the data is
formatted, they simply transfer a buffer full of bytes from and to a disk file.
The parameters to write() and read() are the address of the data buffer and its
length. The address must be cast to type char, and the length is the length in
bytes (characters), not the number of data items in the buffer.
Example
Example
#include <fstream.h> // for file streams
const int MAX = 100; // number of ints
int buff[MAX]; // buffer for integers
int main() {
int j;
for(j=0; j<MAX; j++) // fill buffer with data
Streams 12
Writing
Writing an
an Object
Object to
to Disk
Disk
When writing an object, you generally want to use binary mode. This
writes the same bit configuration to disk that was stored in memory and
ensures that numerical data contained in objects is handled properly.
#include <fstream.h> // for file streams
class person { // class of persons
Streams 12
protected:
char name[40]; // person's name
int age; // person's age
public:
void getData(void) { // get person's data
std::cout << "Enter name: "; cin >> name;
std::cout << "Enter age: "; cin >> age;
}
};
on the same class of objects. Objects of class person in these programs are exactly
42 bytes long, with the first 40 occupied by a string representing the person’s name
and the last 2 containing an int representing the person’s age.
Notice, however, that although the person classes in both programs have the same
data, they may have different member functions. The first includes the single
function getData(), whereas the second has only showData(). It doesn’t matter
what member functions you use, because members functions are not written to disk
along with the object’s data. The data must have the same format, but
inconsistencies in the member functions have no effect. This is true only in simple
classes that don’t use virtual functions.
I/O
I/O with
with Multiple
Multiple Objects
Objects
#include <fstream.h> // for file streams
class person { // class of persons
protected:
char name[40]; // person's name
int age; // person's age
Streams 12
public:
void getData() { // get person's data
cout << "\n Enter name: "; cin >> name;
cout << " Enter age: "; cin >> age;
}
void showData() { // display person's data
cout << "\n Name: " << name;
cout << "\n Age: " << age;
}
};
Object Oriented Programming 543
NotesHub.co.in | Download Android App
int main(){
objfile.cpp
char ch;
person pers; // create person object
fstream file; // create input/output file
file.open("PERSON.DAT", ios::out | ios::binary ); // open for append
do{ // data from user to file
cout << "\nEnter person's data:";
pers.getData(); // get one person's data
file.write( (char*)&pers, sizeof(pers) ); // write to file
Streams 12
Reacting
Reacting to
to Errors
Errors
The next program shows how errors are most conveniently handled. All disk operations are
checked after they are performed. If an error has occurred, a message is printed and the program
terminates. We will use the technique, discussed earlier, of checking the return value from the
object itself to determine its error status. The program opens an output stream object, writes an
entire array of integers to it with a single call to write(), and closes the object. Then it opens an
input stream object and reads the array of integers with a call to read().
Streams 12
Analyzing Errors
In the previous example, we determined whether an error occurred in an I/O
operation by examining the return value of the entire stream object.
if(!is)
// error occurred
However, it’s also possible, using the ios error-status bits, to find out more specific
information about a file I/O error.
Object Oriented Programming 546
NotesHub.co.in | Download Android App
This program first checks the value of the object file. If its value is zero, the
file probably could not be opened because it didn’t exist. Here’s the output of
the program when that’s the case:
Can't open GROUP.DAT
file = 0x1c730000
Error state = 4
good() = 0
Streams 12
eof() = 0
fail() = 4
bad() = 4
The error state returned by rdstate() is 4. This is the bit that indicates the file
doesn’t exist; it’s set to 1. The other bits are all set to 0. The good() function
returns 1 (true) only when no bits are set, so it returns 0 (false). I’m not at
EOF, so eof() returns 0. The fail() and bad() functions return nonzero because
an error occurred.
In a serious program, some or all of these functions should be used after every
I/O operation to ensure that things have gone as expected.
Object Oriented Programming 548
NotesHub.co.in | Download Android App
File
File Pointers
Pointers
Each file object has associated with it two integer values called the get pointer and the put
pointer. These are also called the current get position and the current put position, or—if it’s
clear which one is meant—simply the current position. These values specify the byte number
in the file where writing or reading will take place
There are times when you must take control of the file pointers yourself so that you can read
from or write to an arbitrary location in the file. The seekg() and tellg() functions allow you to
Streams 12
set and examine the get pointer, and the seekp() and tellp() functions perform the same actions
on the put pointer.
// seeks particular person in file
#include <fstream.h> // for file streams
class person { // class of persons
protected:
char name[40]; // person's name
int age; // person's age
public:
void showData() { // display person's data
cout << "\n Name: " << name; cout << "\n Age: " << age;
}
};
Object Oriented Programming 549
NotesHub.co.in | Download Android App
int main(){
person pers; // create person object
ifstream infile; // create input file
infile.open("PERSON.DAT", ios::binary); // open file
infile.seekg(0, ios::end); // go to 0 bytes from end
int endposition = infile.tellg(); // find where we are
int n = endposition / sizeof(person); // number of persons
cout << endl << "There are " << n << " persons in file";
cout << endl << "Enter person number: "; cin >> n;
Streams 12
File
File I/O
I/O Using
Using Member
Member Functions
Functions
So far, we’ve let the main() function handle the details of file I/O. This
is nice for demonstrations, but in real object-oriented programs, it’s
natural to include file I/O operations as member functions of the class.
cout << "\n Name: " << name; cout << "\n Age: " << age; }
void diskIn(int ); // read from file
void diskOut(); // write to file
static int diskCount(); // return number of persons in file
};
void person::diskIn(int pn){ // read person number pn from file
ifstream infile; // make stream
infile.open("PERSON.DAT", ios::binary); // open it
infile.seekg( pn*sizeof(person) ); // move file ptr
infile.read( (char*)this, sizeof(*this) ); // read one person
}
Object Oriented Programming 552
NotesHub.co.in | Download Android App
Overloading
Overloading the
the «« and
and »»Operators
Operators
In this session I’ll show how to overload the extraction and insertion operators. This is a
powerful feature of C++. It lets you treat I/O for user-defined data types in the same
way as for basic types such as int and double. For example, if you have an object of
class TComplex called c1, you can display it with the statement
cout << c1; just as if it were a basic data type.
You can overload the extraction and insertion operators so they work with the display
Streams 12
and keyboard (cout and cin). With a little more care, you can also overload them so they
work with disk files as well.
#include<iostream>
class TComplex {
float real,img;
friend std::istream& operator >>(std::istream&, TComplex&);
friend std::ostream& operator <<(std::ostream&, const TComplex&);
public:
TComplex(float rl=0,float ig=0){real=rl;img=ig;}
TComplex operator+(const TComplex&);
};
Object Oriented Programming 555
NotesHub.co.in | Download Android App
istream& operator >>(istream& stream, TComplex& z){ // Overloading >>
cout << "Enter real part:";
stream >> z.real;
cout << "Enter imaginer part:";
stream >> z.img;
return stream;
}
ostream& operator <<(ostream& stream, const TComplex & z){
stream << "( " << z.real << " , " << z.img << " ) \n";
Streams 12
return stream;
}
TComplex TComplex::operator+(const TComplex & z){ // Operator +
return TComplex (real+z.real , img+z.img);
}
int main(){
TComplex z1,z2,z3;
std::cin >> z1;
std::cin >> z2;
z3=z1+z2;
std::cout << " Result=" << z3; inout.cpp
}
Object Oriented Programming 556
NotesHub.co.in | Download Android App
Overloading
Overloading for
for Files
Files
The next example shows how the << and >> operators can be overloaded so they
work with both file I/O and cout and cin.
#include<fstream>
class TComplex {
float real,img;
friend istream& operator >>(istream&, TComplex&);
Streams 12
Overloading
Overloading for
for Binary
Binary I/O
I/O
So far, you’ve seen examples of overloading operator<<() and operator>>() for formatted
I/O. They also can be overloaded to perform binary I/O. This may be a more efficient way
to store information, especially if your object contains much numerical data.
protected:
char name[40]; // person's name
int age; // person's age
public:
void getData(){ // get data from keyboard
cout << "\n Enter name: "; cin.getline(name, 40);
cout << " Enter age: "; cin >> age;
}
void putData(){ // display data on screen
cout << "\n Name = " << name; cout << "\n Age = " << age;
}
friend istream& operator >> (istream& s, person& d);
friend ostream& operator << (ostream& s, person& d);
Object Oriented Programming 559
NotesHub.co.in | Download Android App
int main(){
person pers1, pers2, pers3, pers4;
cout << "\nPerson 1";
pers1.getData(); // get data for pers1
cout << "\nPerson 2";
pers2.getData(); // get data for pers2
outfile("PERSON.DAT", ios::binary);
Streams 12