ch4part1

50
1 Chapter 4: CONSTRUCTORS, DESTRUCTORS, FRIENDS (part 1)

Upload: sam-zee

Post on 20-Jul-2016

223 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Ch4part1

1

Chapter 4:

CONSTRUCTORS, DESTRUCTORS, FRIENDS

(part 1)

Page 2: Ch4part1

DCS5088 :: Chapter 4 (part 1) 2

Objectives

At the end of this lecture, students shouldbe able to :• Explain what are constructors and destructors• Implement the various types of constructors

default, parameterized, overloaded, initialization list, copy constructors

• Implement destructors

Page 3: Ch4part1

DCS5088 :: Chapter 4 (part 1) 3

4.1 Constructor

• DefinitionA constructor is a member (method) that is called

automatically each time when an object is created.The constructor allocates sufficient memory space

for the object.C++ will automatically supply a constructor if it is not

supplied in the program.

Page 4: Ch4part1

DCS5088 :: Chapter 4 (part 1) 4

4.1.1 Characteristics of a Constructor

1. Constructor has the same name as the class.

class Staff{ public: Staff ( ); // constructor declaration

};

Page 5: Ch4part1

DCS5088 :: Chapter 4 (part 1) 5

4.1.1 Characteristics of a Constructor (cont…)

2. Constructor’s purpose is to allocate memory for object creation.

3. It is called automatically when objects are created, this means… we don’t have to invoke it like functions.

4. A constructor does not return a value.5. An argument can be sent to the constructor.

Page 6: Ch4part1

DCS5088 :: Chapter 4 (part 1) 6

Example (constructor)#include<iostream>using namespace std;class Numbers { private: int n1, n2;

public:

Numbers() { cout<<"This is the constructor"<<endl; n1 = n2 = 0; }

} ;

Constructor

Continue….

Page 7: Ch4part1

DCS5088 :: Chapter 4 (part 1) 7

Example (constructor)- (cont…)

void main(){ Numbers A, B

}Numbers() { cout<<"This is the constructor"<<endl; n1 = n2 = 0; }

First call by First object (A)

Second call by Second object (B)

Page 8: Ch4part1

DCS5088 :: Chapter 4 (part 1) 8

Initialization of Object’s values

n1

n2

0

0

n1

n2

0

0

A B

Page 9: Ch4part1

DCS5088 :: Chapter 4 (part 1) 9

Output:Numbers A, B Call constructor twice

in the order of object creation.

This is the constructor This is the constructor

Output:

Page 10: Ch4part1

DCS5088 :: Chapter 4 (part 1) 10

4.2 Default constructor

• A constructor with empty arguments.• Whenever a new object is created, the

default constructor is invoked.• The previous example uses this.

Page 11: Ch4part1

DCS5088 :: Chapter 4 (part 1) 11

4.3 Parameterized Constructor

• A constructor can have many parameters.

• If the constructor receives a parameter when the object is created, the parameter must be included with the declaration of the object.

Page 12: Ch4part1

DCS5088 :: Chapter 4 (part 1) 12

Example (Parameterized Constructor)

#include<iostream>using namespace std;class Numbers { private: int n1, n2;

public:

Numbers(int a, int b) { n1=a; n2=b;

cout<<"This is the parameterized constructor"<<endl; }

} ; Continue….

Page 13: Ch4part1

DCS5088 :: Chapter 4 (part 1) 13

Example (Parameterized Constructor) – (cont…)

void main(){ Numbers Ob(10, 18);

}

Numbers(int a, int b) { n1=a; n2=b; cout<<"This is the parameterized constructor"<<endl; }

10 is copied into a,18 is copied into b

Page 14: Ch4part1

DCS5088 :: Chapter 4 (part 1) 14

Initialization of Object’s values

n1

n2

10

18

Ob

Page 15: Ch4part1

DCS5088 :: Chapter 4 (part 1) 15

Output:Numbers Ob(10, 18);

Call parameterized constructor

This is the parameterized constructor

Output:

Page 16: Ch4part1

DCS5088 :: Chapter 4 (part 1) 16

4.4 Constructors with initialization list

• Applies to default constructors and also parameterized constructor

• The value is entered after an argument list for function, starting with single point symbol ( : ).

Page 17: Ch4part1

DCS5088 :: Chapter 4 (part 1) 17

Example (Parameterized Constructor with Initialization list)

#include<iostream>using namespace std;class Numbers { private: int n1, n2;

public:

Numbers(int a, int b) : n1(a), n2(b) { cout<<"This is the parameterized constructor"<<endl;

}} ;

Similar to earlier parameterized constructor

Page 18: Ch4part1

DCS5088 :: Chapter 4 (part 1) 18

Exercise 1• Given a class below, create a parameterized

constructor with initialization list

class DoubleNum{ private: double a, b;

};

Page 19: Ch4part1

DCS5088 :: Chapter 4 (part 1) 19

4.5 Overloaded Constructors

• Constructors can also be overloaded.• You only have to list down all the

different version of constructor needed to be used in the class.

• The main purpose of overloading a constructor is to provide options or give the object initial value or not.

Page 20: Ch4part1

DCS5088 :: Chapter 4 (part 1) 20

Example (Overloaded Constructors)

#include<iostream>using namespace std;class Numbers { private: int n1, n2;

public: Numbers(int a, int b) : n1(a), n2(b) { cout<<"This is the parameterized constructor"<<endl;

} Numbers( ) : n1(0), n2(0) {cout<<"This is the default constructor"<<endl; } } ; Continue….

Page 21: Ch4part1

DCS5088 :: Chapter 4 (part 1) 21

Example (Overloaded Constructors) – (cont…)

void main(){ Numbers Ab, Cd(3,5);

}Default constructor will

be called first

Parameterized constructor will be called next

Page 22: Ch4part1

DCS5088 :: Chapter 4 (part 1) 22

Initialization of Object’s values

n1

n2

0

0

n1

n2

3

5

Ab Cd

Page 23: Ch4part1

DCS5088 :: Chapter 4 (part 1) 23

Output:Numbers Ab, Cd(3,5);

Default constructor called first followed by parameterized constructor

This is the default constructor This is the parameterized constructor

Output:

Page 24: Ch4part1

DCS5088 :: Chapter 4 (part 1) 24

4.6 Copy Constructors• Copy constructors are a specialized form of a

constructor used to construct a copy of an object from an object of the same type.

• A copy constructor is supposed to construct a new object which is initialized to a copy of an existent object.

• The copied constructor takes a reference to a const parameter.

• It is const to guarantee that the copy constructor doesn't change it.

Page 25: Ch4part1

DCS5088 :: Chapter 4 (part 1) 25

4.6 Copy Constructors (cont..)

• If you don't provide your own copy constructor, C++ generates one for you.

• The copy constructor provided by C++ performs a member-by-member copy of each data member.

Page 26: Ch4part1

DCS5088 :: Chapter 4 (part 1) 26

#include<iostream>using namespace std;class base{ private: int val; public: base(int x=0) { val=x; cout<<endl<<"Constructor; value:"<<val; }

~base( ) { cout<<endl<<"Destructor; value:"<<val; }

base(const base &rc) { cout<<endl<<"Copy constructor"; val=rc.val + 10; }};

Continue….

Copy Constructor

Page 27: Ch4part1

DCS5088 :: Chapter 4 (part 1) 27

int main( ){ base b1; //creates a new object newobj1 based on an existing class b1 base newobj1 = b1; //calls copy constructor

//another way to create a new object newobj2 based on existing

//object b1 base newobj2 (b1); //calls copy constructor return 0;}

Page 28: Ch4part1

DCS5088 :: Chapter 4 (part 1) 28

Output

Page 29: Ch4part1

DCS5088 :: Chapter 4 (part 1) 29

Exercise 2

• Create a class called BoxDeclare a private data member: int lengthDefine a mutator and accessor functionCreate overloaded constructors (default and

parameterized). In the default constructor, initialize the length with 10 using initialization list

Create a copy constructor

Page 30: Ch4part1

DCS5088 :: Chapter 4 (part 1) 30

Exercise 3• Given a class (in the next slide) and

sample output (in the next two slides), in the main() :Declare an array of 3 objectsSet the objects to values 20.0, 30.0, 40.0 by

using the appropriate function.Display the values of all the objects using

the appropriate function

Page 31: Ch4part1

DCS5088 :: Chapter 4 (part 1) 31

#include<iostream>#include<string>#include<iomanip>using namespace std;class Marks{private: double point;public: Marks() { point = 0.00;}

Marks(double p) { point = p;}

void setPoint(double p) { point = p; } double getPoint() { return point; }};

Page 32: Ch4part1

DCS5088 :: Chapter 4 (part 1) 32

Sample Output

Page 33: Ch4part1

DCS5088 :: Chapter 4 (part 1) 33

//Answer:int main( ){ Marks m1[3] ; double val=20;

for(int i=0; i<3; i++) { m1[i].setPoint(val+(i*10)); cout<<fixed<<showpoint<<setprecision(2)<<

m1[i].getPoint()<<endl;

} return 0;}

Page 34: Ch4part1

DCS5088 :: Chapter 4 (part 1) 34

Exercise 4• Using the class at Exercise 3, identify the output if you

have the following:

int main(){ Marks m, n1[3] = { 10.5, 20.5, 59.1 }; cout<<fixed<<showpoint<<setprecision(2); cout<<m.getPoint()<<endl; cout<<n1[2].getPoint()*2<<endl; return 0;

}

Page 35: Ch4part1

DCS5088 :: Chapter 4 (part 1) 35

4.7 Destructors

• DefinitionThe destructor is a function that is called

automatically when an object is destroyed or goes out of scope.

The destructor reclaims the memory that is allocated to the object.

Page 36: Ch4part1

DCS5088 :: Chapter 4 (part 1) 36

4.7.1 Characteristics of destructor

• A destructor has the same name as the class, but it has a tilde (~ ) in front of it as shown in the following example.Does not return a value and therefore it does not

have a type specifier. Only one destructor in a class allowed.

Page 37: Ch4part1

DCS5088 :: Chapter 4 (part 1) 37

Example (Destructor)#include<iostream>using namespace std;class Numbers { private: int n1, n2;

public: Numbers(int a, int b) : n1(a), n2(b) { cout<<"This is the parameterized constructor"<<endl;

} Numbers() : n1(0), n2(0) {cout<<"This is the default constructor"<<endl; } Continue….

Page 38: Ch4part1

DCS5088 :: Chapter 4 (part 1) 38

Example (Destructor) – (cont…)

~Numbers() { cout<<"Object Destructed"<<endl;

cout<<n1<<" "<<n2<<endl; }} ; //end of class

Destructor

Continue….

Page 39: Ch4part1

DCS5088 :: Chapter 4 (part 1) 39

Example (Destructor) – (cont…)

void main(){ Numbers Ab, Cd(3,5);

} Recall:1) Ab calls default constructor2) Cd calls parameterized constructor

Page 40: Ch4part1

DCS5088 :: Chapter 4 (part 1) 40

Initialization of Object’s values

n1

n2

0

0

n1

n2

3

5

Ab

Cd

Page 41: Ch4part1

DCS5088 :: Chapter 4 (part 1) 41

Recall Output:Numbers Ab, Cd(3,5);

Default constructor called first. Next, parameterized constructor

This is the default constructor This is the parameterized constructor

Output:

Page 42: Ch4part1

DCS5088 :: Chapter 4 (part 1) 42

Example (Destructor) – (cont…)

void main(){ Numbers Ab, Cd(3,5);

} At this point object goes out of scope, therefore they are deallocated by destructorDestructors are called twice (2 objects) in reverse order of object creation.

Page 43: Ch4part1

DCS5088 :: Chapter 4 (part 1) 43

Order of Destruction

n1

n2

0

0

n1

n2

3

5

Ab

Cd

Second, Destructor

called for Ab

First, Destructor

called for Cd

Page 44: Ch4part1

DCS5088 :: Chapter 4 (part 1) 44

Extra Output due to Destructor

This is the default constructor This is the parameterized constructorObject Destructed3 5

Output:

~Numbers() { cout<<"Object Destructed"<<endl; cout<<n1<<" "<<n2<<endl; }

Cd destructed

Page 45: Ch4part1

DCS5088 :: Chapter 4 (part 1) 45

Extra Output due to Destructor

This is the default constructor This is the parameterized constructorObject Destructed3 5Object Destructed0 0

Output:

~Numbers() { cout<<"Object Destructed"<<endl; cout<<n1<<" "<<n2<<endl; }

Ab destructed

Page 46: Ch4part1

DCS5088 :: Chapter 4 (part 1) 46

Exercise 5

• What is the output of the following program (slide 47, 48, 49)?

Page 47: Ch4part1

DCS5088 :: Chapter 4 (part 1) 47

#include<iostream>using namespace std;class base{ private: int val; public: base(int x=0) { val=x; cout<<endl<<"Constructor; value:"<<val; }

~base( ) { cout<<endl<<"Destructor; value:"<<val; }

base(const base &rc) { cout<<endl<<"Copy constructor"; val = rc.val + 10; }

Continue….

Page 48: Ch4part1

DCS5088 :: Chapter 4 (part 1) 48

void setVal(int n) { val = n; }

void display( ) { cout<<“\n val = “<<val<<endl; }

}; //end of class

void abc(base obj){ cout<<"obj in function abc ::"; obj.display(); obj.setVal(10); cout<<"modified obj in function abc ::"; obj.display();}

Note: You should realize that abc(…)is NOT a member function.

The obj is a new object of class base. When this function is called, obj will have a copy of object from the calling function..

When this function ends, the memory for obj will be deallocated. Thus, destructor will be called once due to obj goes out of scope

Page 49: Ch4part1

DCS5088 :: Chapter 4 (part 1) 49

int main( ){ base b1,b2(105);

abc(b2); cout<<"b2 :"; b2.display(); cout<<"b1 :"; b1.display();

}

Page 50: Ch4part1

DCS5088 :: Chapter 4 (part 1) 50

Answer (output)