ece 264 object-oriented software development

14
ECE 264 Object-Oriented Software Development Instructor: Dr. Honggang Wang Fall 2012 Lecture 28: Destructors and Copy Constructors

Upload: amir-clark

Post on 01-Jan-2016

20 views

Category:

Documents


2 download

DESCRIPTION

ECE 264 Object-Oriented Software Development. Instructor: Dr. Honggang Wang Fall 2012 Lecture 28: Destructors and Copy Constructors. Lecture outline. Announcements / reminders Design due 11/19 Submit either through group folder or via e-mail - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ECE 264 Object-Oriented Software Development

ECE 264Object-Oriented

Software Development

Instructor: Dr. Honggang WangFall 2012

Lecture 28: Destructors and Copy Constructors

Page 2: ECE 264 Object-Oriented Software Development

Lecture outline Announcements / reminders

Design due 11/19 Submit either through group folder or via e-mail

Lab session time (2:00 -3:15 pm, Wednesday, 11/07) Project groups to work on the design, and meet with Dr. Wang in his office;

Attendance are required. The meeting schedule is as follows 2:00-2:15 pm meeting with group 1 2:15-2:30 pm meeting with group 2 2:30-2:45 pm meeting with group 3 2:45-3:00 pm meeting with group 4

Exam 2 at 9:00-9:50 on 11/14 (Wednesday) Review on Friday (11/09)

Today Brief review of dynamic memory allocation Destructors Copy constructors

04/20/23 ECE 264: Lecture 26 2

Page 3: ECE 264 Object-Oriented Software Development

Destructors Destructors: function called when object is

destroyed and used for “object cleanup” When are these functions called?

End of function When dynamically allocated object is freed

When are destructors really necessary? When object contains dynamically allocated data

General syntax: similar to constructor

<class name>::~<class name>() {}

ECE 264: Lecture 26 304/20/23

Page 4: ECE 264 Object-Oriented Software Development

Destructor exampleclass dynamicIntArray {

private:

int n_elem; // size of array

int *arr;

public:

dynamicIntArray();

dynamicIntArray(int n);

~dynamicIntArray();

}

// Assume array initially has 0 elements

dynamicIntArray::dynamicIntArray() :

n_elem(0) {

arr = NULL;

n_elem = 0;

}

dynamicIntArray::dynamicIntArray(int n) :

n_elem(n) {

arr = new int[n_elem];

}

dynamicIntArray::~dynamicIntArray() {

delete [] arr;

}

ECE 264: Lecture 26 404/20/23

Page 5: ECE 264 Object-Oriented Software Development

Composition and destructors If a class has a data object as a member, the

member destructor is automatically called DO NOT explicitly call destructors!

class tenElementArr{

private:

dynamicIntArray dia;

public:

tenElementArr();

~tenElementArr();

}

ECE 264: Lecture 26 5

tenElementArr::tenElementArr : dia(10) { }

tenElementArr ::~tenElementArr()

{

/* empty destructor—arr’s

destructor called automatically */

}

04/20/23

Page 6: ECE 264 Object-Oriented Software Development

Copy constructors: Constructor example Given following code,

on what lines are constructors called? Assume functions f1 and

f2 have following prototype: void f(Point p); void f2(Point &p);

1. Point p1, p2;2. Point p3(3,7);3. Point p4 = p3;4. p2 = p3;5. f(p4);6. f2(p3);

Answer: all lines except lines 4 & 6

Clearly declaring new objects in lines 1-3

Default in line 1 Parameterized in line 2

No new object in line 4 Pass by value—create

new object and copy data members from argument (line 5)

Pass by reference—copy pointer (line 6)

04/20/23 ECE 264: Lecture 26 6

Page 7: ECE 264 Object-Oriented Software Development

Copy constructors We’ve seen two forms of constructors

Default Parameterized

Third type of constructor: copy constructor Used to initialize a newly declared variable from an

existing variable Not called for assignments Example:

Point p1(2,3), p3;Point p2 = p1;// calls copy constructorp3 = p2; // uses assignment

Often generated by default

ECE 264: Lecture 26 704/20/23

Page 8: ECE 264 Object-Oriented Software Development

Basic copy constructor: PointPoint::Point(const Point &p) {

xCoord = p.xCoord;

yCoord = p.yCoord;

}

Argument p Passed by reference Specified as const

Function cannot change value of p

Copies all data members from p to current object

04/20/23 ECE 264: Lecture 26 8

Page 9: ECE 264 Object-Oriented Software Development

Default copy constructors By default, copy constructor performs a

shallow copy Directly copies data members from one object to

the other When is a shallow copy a problem?

Pointer-based data Arrays Dynamically allocated data (scalars and arrays)

In these cases, prefer deep copy

ECE 264: Lecture 26 904/20/23

Page 10: ECE 264 Object-Oriented Software Development

Example: deep copySay we have the following class:

class tenInts {

private:

int arr[10];

...

}

What would copy constructor look like?

04/20/23 ECE 264: Lecture 26 10

Page 11: ECE 264 Object-Oriented Software Development

Example: deep copy (cont.)tenInts::tenInts(const tenInts &t){

for (int i=0; i < 10; i++)arr[i] = t.arr[i];

}

Copy array values element by element Note: If class contained scalar values, would

have to copy them as well Copy constructor must account for all variables in

class—even those that would have been handled correctly by the default shallow copy

04/20/23 ECE 264: Lecture 26 11

Page 12: ECE 264 Object-Oriented Software Development

Example: revisit dynamicIntArray Say we want to add a copy constructor to the dynamicIntArray

class shown earlier:class dynamicIntArray {private:

int n_elem; // size of arrayint *arr;

public:dynamicIntArray();dynamicIntArray(int n);~dynamicIntArray();…

}

What change(s) would we need to make to the .h file? How would we write the code for this function in the .cpp file?

04/20/23 ECE 264: Lecture 26 12

Page 13: ECE 264 Object-Oriented Software Development

Solution Add the following to the .h file:

dynamicIntArray(const dynamicIntArray &);

Write the function as follows in the .cpp file:dynamicIntArray::dynamicIntArray(const dynamicIntArray &d)

{

n_elem = d.n_elem;

for (int i = 0; i < n_elem; i++)

arr[i] = d.arr[i];

}

04/20/23 ECE 264: Lecture 26 13

Page 14: ECE 264 Object-Oriented Software Development

Final notes Next time

Exam 2 review and Operator overloading Acknowledgements: this lecture borrows

heavily from lecture slides provided with the following texts: Deitel & Deitel, C++ How to Program, 8th ed. Etter & Ingber, Engineering Problem Solving with

C++, 2nd ed.

04/20/23 ECE 264: Lecture 26 14