C - by Balaguruswami - E.Balagurusamy
C - by Balaguruswami - E.Balagurusamy
C++
1
OBJECTIVES
Introduction
What is object-oriented programming?
Two versions of C++
C++ console I/O
C++ comments
Classes: A first look
Some differences between C and C++
Introducing function overloading
C++ keywords
Introducing Classes
2
INTRODUCTION
C++ is the C programmer’s answer to Object-
Oriented Programming (OOP).
C++ is an enhanced version of the C language.
3
INTRODUCTION (CONT.)
The elements of a computer language do not exist in a
void, separate from one another.
The features of C++ are highly integrated.
4
WHAT IS OOP?
OOP is a powerful way to approach the task of
programming.
OOP encourages developers to decompose a
problem into its constituent parts.
Each component becomes a self-contained object
that contains its own instructions and data that
relate to that object.
So, complexity is reduced and the programmer
can manage larger programs.
5
WHAT IS OOP? (CONT.)
All
OOP languages, including C++, share three
common defining traits:
Encapsulation
Binds together code and data
Polymorphism
Allows one interface, multiple methods
Inheritance
Provides hierarchical classification
Permits reuse of common code and data
6
TWO VERSIONS OF C++
A traditional-style C++ program -
#include <iostream.h>
int main()
{
/* program code */
return 0;
}
7
TWO VERSIONS OF C++ (CONT.)
A modern-style C++ program that uses the new-style
headers and a namespace -
#include <iostream>
using namespace std;
int main()
{
/* program code */
return 0; 8
}
THE NEW C++ HEADERS
The new-style headers do not specify filenames.
They simply specify standard identifiers that might be
mapped to files by the compiler, but they need not be.
<iostream>
<vector>
<string>, not related with <string.h>
<cmath>, C++ version of <math.h>
<cstring>, C++ version of <string.h>
Programmer defined header files should end in “.h”.
9
SCOPE RESOLUTION OPERATOR (::)
Unary Scope Resolution Operator
Usedto access a hidden global variable
Example: usro.cpp
Binary Scope Resolution Operator
Used to associate a member function with its class
(will be discussed shortly)
Used to access a hidden class member variable (will
be discussed shortly)
Example: bsro.cpp
10
NAMESPACES
A namespace is a declarative region.
It localizes the names of identifiers to avoid name
collisions.
The contents of new-style headers are placed in the std
namespace.
A newly created class, function or global variable can
put in an existing namespace, a new namespace, or it
may not be associated with any namespace
In the last case the element will be placed in the global unnamed
namespace.
Example: namespace.cpp
11
C++ CONSOLE I/O (OUTPUT)
cout << “Hello World!”;
cout ???
printf(“Hello World!”);
cout << iCount; /* int iCount */ Shift right operator ???
printf(“%d”, iCount);
How does a shift right
cout << 100.99;
operator produce output
printf(“%f”, 100.99); to the screen?
cout << “\n”, or cout << ‘\n’, or cout << endl
printf(“\n”)
In general, cout << expression;
13
Hmmm. Again polymorphism.
C++ CONSOLE I/O (I/O CHAINING)
cout << “Hello” << ‘ ‘ << “World” << ‘!’;
cout << “Value of iCount is: ” << iCount;
14
What’s actually happening here? Need to learn more.
C++ CONSOLE I/O (EXAMPLE)
include <iostream> include <iostream>
int main() using namespace std;
{ int main()
char str[16]; {
std::cout << “Enter a string: ”; char str[16];
std::cin >> str; cout << “Enter a string: ”;
std::cout << “You entered: ” cin >> str;
<< str; cout << “You entered: ”
} << str;
}
15
C++ COMMENTS
Multi-line comments
/* one or more lines of comments */
Single line comments
// …
16
CLASSES: A FIRST LOOK
General syntax -
class class-name
{
// private functions and variables
public:
// public functions and variables
}object-list (optional);
17
CLASSES: A FIRST LOOK (CONT.)
A class declaration is a logical abstraction that
defines a new type.
It determines what an object of that type will
look like.
An object declaration creates a physical entity of
that type.
That is, an object occupies memory space, but a
type definition does not.
Example: p-23.cpp, p-26.cpp, stack-test.c.
18
CLASSES: A FIRST LOOK (CONT.)
Each object of a class has its own copy of every variable
declared within the class (except static variables which
will be introduced later), but they all share the same
copy of member functions.
How do member functions know on which object they have
to work on?
The answer will be clear when “this” pointer is introduced.
19
SOME DIFFERENCES BETWEEN
C AND C++
No need to use “void” to denote empty parameter list.
All functions must be prototyped.
If a function is declared as returning a value, it must
return a value.
Return type of all functions must be declared explicitly.
Local variables can be declared anywhere.
C++ defines the bool datatype, and keywords true (any
nonzero value) and false (zero).
20
INTRODUCING FUNCTION
OVERLOADING
21
INTRODUCING FUNCTION
OVERLOADING (CONT.)
The compiler will automatically select the correct
version.
The return type alone is not a sufficient difference to
allow function overloading.
Example: p-34.cpp, p-36.cpp, p-37.cpp.
23
INTRODUCING
CLASSES
24
CONSTRUCTORS
Every object we create will require some sort of initialization.
A class’s constructor is automatically called by the compiler
each time an object of that class is created.
A constructor function has the same name as the class and has
no return type.
There is no explicit way to call the constructor.
25
DESTRUCTORS
The complement of a constructor is the destructor.
This function is automatically called by the compiler when an
object is destroyed.
The name of a destructor is the name of its class, preceded by
a ~.
There is explicit way to call the destructor but highly
discouraged.
Example : cons-des-0.cpp
26
CONSTRUCTORS &
DESTRUCTORS
For global objects, an object’s constructor is called once, when
the program first begins execution.
For local objects, the constructor is called each time the
declaration statement is executed.
Local objects are destroyed when they go out of scope.
Example: cons-des-1.cpp
27
CONSTRUCTORS &
DESTRUCTORS
Constructors and destructors are typically declared as public.
That is why the compiler can call them when an object of a
class is declared anywhere in the program.
If the constructor or destructor function is declared as private
then no object of that class can be created outside of that class.
What type of error ?
Example: private-cons.cpp, private-des.cpp
28
CONSTRUCTORS THAT TAKE
PARAMETERS
It is possible to pass arguments to a constructor function.
Destructor functions cannot have parameters.
A constructor function with no parameter is called the default
constructor and is supplied by the compiler automatically if no
constructor defined by the programmer.
The compiler supplied default constructor does not initialize
the member variables to any default value; so they contain
garbage value after creation.
Constructors can be overloaded, but destructors cannot be
overloaded.
A class can have multiple constructors.
Example: cons-des-3.cpp, cons-des-4.cpp, cons-des-5.cpp,
cons-des-6.cpp
29
OBJECT POINTERS
It is possible to access a member of an object via a pointer to
that object.
Object pointers play a massive role in run-time polymorphism
(will be introduced later).
When a pointer is used, the arrow operator (->) rather than the
dot operator is employed.
Just like pointers to other types, an object pointer, when
incremented, will point to the next object of its type.
Example: obj.cpp
30
IN-LINE FUNCTIONS
Functions that are not actually called but, rather, are expanded
in line, at the point of each call.
Advantage
Have no overhead associated with the function call and
return mechanism.
Can be executed much faster than normal functions.
Safer than parameterized macros. Why ?
Disadvantage
If they are too large and called too often, the program grows
larger.
31
IN-LINE FUNCTIONS
inline int even(int x) The inline specifier is a request,
{ not a command, to the compiler.
return !(x%2); Some compilers will not in-line a
} function if it contains
A static variable
int main() A loop, switch or goto
{
A return statement
if(even(10)) cout << “10 is even\n”;
If the function is recursive
// becomes if(!(10%2))
return 0;
}
32
AUTOMATIC IN-LINING
Defining a member function inside the class declaration causes
the function to automatically become an in-line function.
In this case, the inline keyword is no longer necessary.
33
AUTOMATIC IN-LINING
// Automatic in-lining // Manual in-lining
class myclass class myclass
{ {
int a; int a;
public: public:
myclass(int n) { a = n; } myclass(int n);
void set_a(int n) { a = n; } int void set_a(int n);
get_a() { return a; } int get_a();
}; };
inline void myclass::set_a(int n)
{
a = n;
} 34
LECTURE CONTENTS
Teach Yourself C++
Chapter1 (Full, with exercises)
Chapter 2.1, 2,2, 2.4, 2.6, 2.7
35
A CLOSER LOOK AT
CLASSES
36
ASSIGNING OBJECTS
One object can be assigned to another provided that both
objects are of the same type.
It is not sufficient that the types just be physically similar
– their type names must be the same.
By default, when one object is assigned to another, a
bitwise copy of all the data members is made. Including
compound data structures like arrays.
Creates problem when member variables point to
dynamically allocated memory and destructors are used
to free that memory.
Solution: Copy constructor (to be discussed later)
Example: assign-object.cpp
37
PASSING OBJECTS TO
FUNCTIONS
Objects can be passed to functions as arguments in just
the same way that other types of data are passed.
By default all objects are passed by value to a function.
38
PASSING OBJECTS TO
FUNCTIONS
In call by reference, as no new objects are formed, constructors
and destructors are not called.
But in call value, while making a copy, constructors are not called
for the copy but destructors are called.
Can this cause any problem in any case?
39
RETURNING OBJECTS FROM
FUNCTIONS
The function must be declared as returning a class type.
When an object is returned by a function, a temporary object
(invisible to us) is automatically created which holds the
return value.
While making a copy, constructors are not called for the copy
but destructors are called
After the value has been returned, this object is destroyed.
The destruction of this temporary object might cause
unexpected side effects in some situations.
Solution: Copy constructor (to be discussed later)
Example: ret-obj-1.cpp, ret-obj-2.cpp, ret-obj-3.cpp
40
FRIEND FUNCTIONS
A friend function is not a member of a class but still has access to its
private elements.
A friend function can be
A global function not related to any particular class
A member function of another class
Inside the class declaration for which it will be a friend, its prototype
is included, prefaced with the keyword friend.
Why friend functions ?
Operator overloading
Certain types of I/O operations
Permitting one function to have access to the private members of
41
two or more different classes
FRIEND FUNCTIONS
class MyClass // friend keyword not used
{ void ff1(MyClass obj)
int a; // private member {
public: cout << obj.a << endl;
MyClass(int a1) { // can access private member ‘a’
a = a1; directly
} MyClass obj2(100);
friend void ff1(MyClass obj); cout << obj2.a << endl;
}; }
void main()
{
MyClass o1(10);
ff1(o1);
} 42
FRIEND FUNCTIONS
A friend function is not a member of the class for which it is a
friend.
MyClass obj(10), obj2(20);
obj.ff1(obj2); // wrong, compiler error
Friend functions need to access the members (private, public or
protected) of a class through an object of that class. The object
can be declared within or passed to the friend function.
A member function can directly access class members.
A function can be a member of one class and a friend of
another.
Example : friend1.cpp, friend2.cpp, friend3.cpp
43
FRIEND FUNCTIONS
class YourClass; // a forward friend int compare (MyClass obj1,
declaration YourClass obj2);
class MyClass { };
int a; // private member void main() {
public: MyClass o1(10); YourClass o2(5);
MyClass(int a1) { a = a1; } int n = compare(o1, o2); // n = 5
friend int compare (MyClass }
obj1, YourClass obj2);
}; int compare (MyClass obj1,
class YourClass { YourClass obj2) {
int a; // private member return (obj1.a – obj2.a);
public: }
YourClass(int a1) { a = a1; }
44
FRIEND FUNCTIONS
class YourClass; // a forward class YourClass {
declaration int a; // private member
class MyClass { public:
int a; // private member YourClass(int a1) { a = a1; }
public: friend int MyClass::compare
MyClass(int a1) { a = a1; } (YourClass obj);
int compare (YourClass obj) { };
return (a – obj.a) void main() {
} MyClass o1(10); Yourclass o2(5);
}; int n = o1.compare(o2); // n = 5
}
45
CONVERSION FUNCTION
Used to convert an object of one type into an object of
another type.
A conversion function automatically converts an object
return 0;
}
47
Department of CSE, BUET
48
CONVERSION FUNCTION
STATIC CLASS MEMBERS
A class member can be declared as static
Only one copy of a static variable exists – no matter how
many objects of the class are created
All objects share the same variable
It can be private, protected or public
A static member variable exists before any object of its
class is created
In essence, a static class member is a global variable that
simply has its scope restricted to the class in which it is
declared
49
STATIC CLASS MEMBERS
When we declare a static data member within a class, we
are not defining it
Instead, we must provide a definition for it elsewhere,
outside the class
To do this, we re-declare the static variable, using the
scope resolution operator to identify which class it
belongs to
All static member variables are initialized to 0 by default
50
STATIC CLASS MEMBERS
The principal reason static member variables are supported by
C++ is to avoid the need for global variables
Member functions can also be static
Can access only other static members of its class directly
Need to access non-static members through an object of
the class
Does not have a this pointer
Cannot be declared as virtual, const or volatile
static member functions can be accessed through an object of
the class or can be accessed independent of any object, via the
class name and the scope resolution operator
Usual access rules apply for all static members
Example: static.cpp
51
STATIC CLASS MEMBERS
class myclass { void main ( ) {
static int x; myclass ob1, ob2;
public: cout << ob1.getX() << endl; // 1
static int y; ob2.setX(5);
int getX() { return x; } cout << ob1.getX() << endl; // 5
void setX(int x) { cout << ob1.y << endl; // 2
myclass::x = x; myclass::y = 10;
} cout << ob2.y << endl; // 10
}; // myclass::x = 100;
int myclass::x = 1; // will produce compiler error
int myclass::y = 2; }
52
CONST MEMBER FUNCTIONS AND
MUTABLE
When a class member is declared as const it can’t
modify the object that invokes it.
A const object can’t invoke a non-const member
54
ARRAYS,
POINTERS
AND
REFERENCES
55
ARRAYS OF OBJECTS
Arrays of objects of class can be declared just like other
variables.
class A{ … };
A ob[4];
ob[0].f1(); // let f1 is public in A
ob[3].x = 3; // let x is public in A
In this example, all the objects of the array are initialized
using the default constructor of A.
If A does not have a default constructor, then the above
array declaration statement will produce compiler error.
56
ARRAYS OF OBJECTS
If a class type includes a constructor, an array of objects
can be initialized
Initializing array elements with the constructor taking an
integer argument
class A{ public: int a; A(int n) { a = n; } };
A ob[2] = { A(-1), A(-2) };
A ob2[2][2] = { A(-1), A(-2), A(-3), A(-4) };
In this case, the following shorthand form can also be
used
A ob[2] = { -1, -2 };
57
ARRAYS OF OBJECTS
If a constructor takes two or more arguments, then only
the longer form can be used.
class A{ public: int a, b; A(int n, int m) { a = n; b =
m; } };
A ob[2] = { A(1, 2), A(3, 4) };
Aob2[2][2] = { A(1, 1), A(2, 2), A(3, 3), A(4, 4) };
58
ARRAYS OF OBJECTS
• We can also mix no argument, one argument and multi-
argument constructor calls in a single array declaration.
class A
{
public:
A() { … } // must be present for this example to be
compiled
A(int n) { … }
A(int n, int m) { … }
};
– A ob[3] = { A(), A(1),A(2, 3) };
59
USING POINTERS TO
OBJECTS
We can take the address of objects using the address
operator (&) and store it in object pointers.
A ob; A *p = &ob;
We have to use the arrow (->) operator instead of the dot
(.) operator while accessing a member through an object
pointer.
p->f1(); // let f1 is public in A
Pointer arithmetic using an object pointer is the same as
it is for any other data type.
When incremented, it points to the next object.
When decremented, it points to the previous object.
60
THIS POINTER
A special pointer in C++ that points to the object that
generates the call to the method
Let,
class A{ public: void f1() { … } };
A ob; ob.f1();
The compiler automatically adds a parameter whose type
is “pointer to an object of the class” in every non-static
member function of the class.
It also automatically calls the member function with the
address of the object through which the function is
invoked.
So the above example works as follows –
class A{ public: void f1( A *this ) { … } };
61
A ob; ob.f1( &ob );
THIS POINTER
It is through this pointer that every non-static member
function knows which object’s members should be used.
class A
{
int x;
public:
void f1()
{
x = 0; // this->x = 0;
}
};
62
THIS POINTER
this pointer is generally used to access member variables
that have been hidden by local variables having the same
name inside a member function.
64
USING NEW AND DELETE
In case of insufficient memory, new can report failure in
two ways
By returning a null pointer
By generating an exception
The reaction of new in this case varies from compiler to
compiler
65
USING NEW AND DELETE
Advantages
No need to use sizeof operator while using new.
New automatically returns a pointer of the specified
type.
In case of objects, new calls dynamically allocates the
object and call its constructor
In case of objects, delete calls the destructor of the
object being released
66
USING NEW AND DELETE
Dynamically allocated objects can be given initial
values.
int *p = new int;
Dynamically allocates memory to store an integer value which
contains garbage value.
int *p = new int(10);
Dynamically allocates memory to store an integer value and
initializes that memory to 10.
Note the use of parenthesis ( ) while supplying initial values.
67
USING NEW AND DELETE
class A{ int x; public: A(int n) { x = n; } };
A *p = new A(10);
Dynamically allocates memory to store a A object and calls the
constructor A(int n) for this object which initializes x to 10.
A *p = new A;
It will produce compiler error because in this example class A does
not have a default constructor.
68
USING NEW AND DELETE
We can also create dynamically allocated arrays using
new.
But deleting a dynamically allocated array needs a slight
change in the use of delete.
It is not possible to initialize an array that is
dynamically allocated.
int *a= new int[10];
Creates an array of 10 integers
All integers contain garbage values
delete [ ] a;
Delete the entire array pointed by a
Note the use of square brackets [ ]
69
USING NEW AND DELETE
It is not possible to initialize an array that is dynamically
allocated, in order to create an array of objects of a class,
the class must have a default constructor.
class A { class A {
int x; int x;
public: public:
A(int n) { x = n; } }; A() { x = 0; }
A(int n) { x = n; } };
A *array = new A[10]; A *array = new A[10]; // no
// compiler error error
// use array
delete [ ] array; 70
USING NEW AND DELETE
A *array = new A[10];
The default constructor is called for all the objects.
delete [ ] array;
Destructor is called for all the objects present in the
array.
71
REFERENCES
A reference is an implicit pointer
Acts like another name for a variable
Can be used in three ways
A reference can be passed to a function
A reference can be returned by a function
An independent reference can be created
Reference variables are declared using the & symbol
void f(int &n);
Unlike pointers, once a reference becomes associated
with a variable, it cannot refer to other variables
72
REFERENCES
Using pointer - Using reference -
void f(int *n) { void f(int &n) {
*n = 100; n = 100;
} }
void main() { void main() {
int i = 0; int i = 0;
f(&i); f(i);
cout << i; // 100 cout << i; // 100
} }
73
REFERENCES
A reference parameter fully automates the call-by-
reference parameter passing mechanism
74
REFERENCES
Advantages
The address is automatically passed
76
PASSING REFERENCES TO
OBJECTS
class myclass { void main() {
int x; myclass obj;
public: cout << obj.getx() << endl;
myclass() { f(obj);
x = 0; cout << obj.getx() << endl;
cout << “Constructing\n”; }
}
~myclass() { Output:
cout << “Destructing\n”; Constructing
} 0
void setx(int n) { x = n; } 500
int getx() { return x; } Destructing
};
void f(myclass &o) {
o.setx(500);
77
}
RETURNING REFERENCES
A function can return a reference
Allows a functions to be used on the left side of an
assignment statement
But, the object or variable whose reference is returned
must not go out of scope
So, we should not return the reference of a local variable
For the same reason, it is not a good practice to return
the pointer (address) of a local variable from a
function
78
RETURNING REFERENCES
int x; // global variable Output:
int &f() { 1
return x; 100
} 2
void main() { So, here f() can be used to both set
x = 1; the value of x and read the value
of x
cout << x << endl;
Example: From Book(151 – 153)
f() = 100;
cout << x << endl;
x = 2;
cout << f() << endl;
}
79
INDEPENDENT REFERENCES
Simply another name for another variable
Must be initialized when it is declared
int &ref; // compiler error
int x = 5; int &ref = x; // ok
ref = 100;
cout << x; // prints “100”
An independent reference can refer to a constant
int &ref=10; // compile error
const int &ref = 10;
80
RESTRICTIONS
We cannot reference another reference
Doing so just becomes a reference of the original
variable
We cannot obtain the address of a reference
Doing so returns the address of the original variable
Memory allocated for references are hidden from the
programmer by the compiler
We cannot create arrays of references
We cannot reference a bit-field
References must be initialized unless they are
members of a class, are return values, or are function
parameters
81
LECTURE CONTENTS
Teach Yourself C++
Chapter 4 (See All Exercise)
82
Department of CSE, BUET
FUNCTION OVERLOADING
83 Chapter 5
OBJECTIVES
Overloading Constructor Functions
Creating and Using a Copy Constructor
84
OVERLOADING CONSTRUCTOR
FUNCTIONS
Itis possible to overload constructors, but
destructors cannot be overloaded.
Three main reasons to overload a constructor
85
OVERLOADING CONSTRUCTOR
FUNCTIONS (CONTD.)
Let, we want to write
MyClass ob1, ob2(10);
87
CREATING AND USING A COPY
CONSTRUCTOR
By default when a assign an object to another object or initialize a
new object by an existing object, a bitwise copy is performed.
This cause problems when the objects contain pointer to
88
CREATING AND USING A COPY
CONSTRUCTOR (CONTD.)
Ifwe do not write our own copy constructor,
then the compiler supplies a copy constructor
that simply performs bitwise copy.
89
CREATING AND USING A COPY
CONSTRUCTOR (CONTD.)
We can see that we cannot give ‘b’ a new (non-default) value without
specifying a new value for ‘a’.
So while specifying non-default values, we have to start from the
leftmost parameter and move to the right one by one. 91
USING DEFAULT ARGUMENTS
(CONTD.)
Relation
between default arguments and function
94
OVERLOADING AND AMBIGUITY
Due to automatic type conversion rules.
Example 1:
95
OVERLOADING AND AMBIGUITY
(CONTD.)
Due to the use of reference parameters.
Example 2:
intx = 1, y = 2;
f2(x, y); // ambiguous, compiler error
96
OVERLOADING AND AMBIGUITY
(CONTD.)
Due to the use of default arguments.
Example 3:
97
FINDING THE ADDRESS OF AN
OVERLOADED FUNCTION
Example:
void space( int a ) { … }
void space( int a, char c ) { … }
98
LECTURE CONTENTS
Teach Yourself C++
Chapter 5 (Full, with exercises)
99
Department of CSE, BUET
INHERITANCE
100 Chapter 7
OBJECTIVES
Base class access control
Using protected members
101
BASE CLASS ACCESS CONTROL
classderived-class-name : access base-class-
name { … };
102
USING PROTECTED MEMBERS
Cannot be directly accessed by non-related classes and
functions
103
VISIBILITY OF BASE CLASS
MEMBERS IN DERIVED CLASS
When a class (derived) inherits from another (base) class, the visibility
of the members of the base class in the derived class is as follows.
105
CONSTRUCTORS, DESTRUCTORS,
AND INHERITANCE (CONTD.)
class base { void main() {
public: derived obj;
base() { }
107
CONSTRUCTORS, DESTRUCTORS,
AND INHERITANCE (CONTD.)
class MyBase { void main() {
public: MyDerived o1; // x = 0, y = 0
int x; MyDerived o2(5); // x = 5, y = 0
109
MULTIPLE INHERITANCE (CONTD.)
b1
dd1
d1
ddd1
114
Department of CSE, BUET
VIRTUAL FUNCTIONS
115 Chapter 10
OBJECTIVES
Polymorphism in C++
Pointers to derived classes
116
POLYMORPHISM IN C++
2 types
Compile time polymorphism
117
POINTERS TO DERIVED CLASSES
C++ allows base class pointers to point to
derived class objects.
118
POINTERS TO DERIVED CLASSES
(CONTD.)
Using a base class pointer (pointing to a derived
class object) we can access only those members
of the derived object that were inherited from
119
POINTERS TO DERIVED CLASSES
(CONTD.)
class base { void main() {
public: base b1;
void show() { b1.show(); // base
120
POINTERS TO DERIVED CLASSES
(CONTD.)
While it is permissible for a base class pointer to point to
a derived object, the reverse is not true.
base b1;
121
POINTERS TO DERIVED CLASSES
(CONTD.)
Let we have –
class base { … };
123
POINTERS TO DERIVED CLASSES
(CONTD.)
124
IMPORTANT POINT ON INHERITANCE
125
INTRODUCTION TO VIRTUAL
FUNCTIONS
A virtual function is a member function that is
declared within a base class and redefined
(called overriding) by a derived class.
126
INTRODUCTION TO VIRTUAL
FUNCTIONS (CONTD.)
While redefining a virtual function in a derived class, the
function signature must match the original function
present in the base class.
127
INTRODUCTION TO VIRTUAL
FUNCTIONS (CONTD.)
class base { void main() {
public: base b1;
130
VIRTUAL DESTRUCTORS (CONTD.)
131
Using non-virtual destructor
VIRTUAL DESTRUCTORS (CONTD.)
132
Using virtual destructor
MORE ABOUT VIRTUAL FUNCTIONS
If we want to omit the body of a virtual function
in a base class, we can use pure virtual functions.
133
MORE ABOUT VIRTUAL
FUNCTIONS (CONTD.)
Pure virtual function
Helps to guarantee that a derived class will provide its
134
FINAL COMMENTS
136
LECTURE CONTENTS
Teach Yourself C++
Chapter 10 (Full, with exercises)
137
MANIPULATING
STRINGS
Resources
[1] Object Oriented Programming with C++ (3rd Edition) E
Balagurusamy
[2] Teach Yourself C++ (3rd Edition) H Schildt
INTRODUCTION
A string is a sequence of character.
s3 += s1; // s3 = s3 + s1;
s3 += “abc”; // s3 = s3 + “abc”;
MANIPULATING STRING OBJECTS
string s1(“12345”);
string s2(“abcde”);
erase()
replace()
append()
RELATIONAL OPERATIONS
Operator Meaning
== Equality
!= Inequality
< Less than
<= Less than or equal
> Greater than
>= Greater than or equal
[] operator For accessing individual character. Makes the string object to look
like an array.
COMPARING AND SWAPPING
There is another overloaded version of compare
s1.swap(s2)
Exchanges the content of string s1 and s2
LECTURE CONTENTS
[1] Object Oriented Programming with C++ (3rd Edition)
E Balagurusamy
Chapter 15 (Full)
[2] Teach Yourself C++ (3rd Edition) H Schildt
Examples only
Study the examples and exercise from both books
carefully