CMSC 202, Version 3/02 1 Copy Constructors and Overloaded Assignment.

Slides:



Advertisements
Similar presentations
Chapter 18 Vectors and Arrays
Advertisements

Constructor. 2 constructor The main use of constructors is to initialize objects. A constructor is a special member function, whose name is same as class.
Data Structures Using C++1 Chapter 3 Pointers and Array-Based Lists.
F UNCTION O VERLOADING Chapter 5 Department of CSE, BUET 1.
CSE 332: C++ copy control I Copy Control (Part I) Copy control consists of 5 distinct operations –A copy constructor initializes an object by duplicating.
Pointers Revisited l What is variable address, name, value? l What is a pointer? l How is a pointer declared? l What is address-of (reference) and dereference.
1 CMSC 202 More C++ Classes. 2 Announcements Project 1 due midnight Sunday 2/25/01 Quiz #2 this week Exam 1 Wednesday/Thursday Project 2 out Monday March.
Class and Objects.
Lecture 3 Feb 4 summary of last week’s topics and review questions (handout) Today’s goals: Chapter 1 overview (sections 1.4 to 1.6) c++ classes constructors,
Rossella Lau Lecture 8, DCO10105, Semester B, DCO10105 Object-Oriented Programming and Design  Lecture 8: Polymorphism & C++ pointer  Inheritance.
Dynamically Allocated Arrays May 2, Quiz 5 Today.
Classes Separating interface from implementation
Shallow Versus Deep Copy and Pointers Shallow copy: when two or more pointers of the same types point to the same memory – They point to the same data.
More Classes in C++ Bryce Boe 2012/08/20 CS32, Summer 2012 B.
OOP Languages: Java vs C++
1 CSE 303 Lecture 22 Advanced Classes and Objects in C++ slides created by Marty Stepp
 2006 Pearson Education, Inc. All rights reserved Classes: A Deeper Look.
Copy Control Joe Meehean. More Class Responsibilities When making a new type (i.e., class) we must specify what happens when it is: Copied Assigned Destroyed.
The Rest of the Story.  Constructors  Compiler-generated  The Initializer List  Copy Constructors  Single-arg (conversion ctors)  The Assignment.
CS212: Object Oriented Analysis and Design Lecture 12: Operator Overloading-II.
Copyright  Hannu Laine C++-programming Part 3 Hannu Laine.
 2006 Pearson Education, Inc. All rights reserved Classes: A Deeper Look, Part 2.
CS212: Object Oriented Analysis and Design Lecture 10: Copy constructor.
CS212: Object Oriented Analysis and Design Lecture 7: Arrays, Pointers and Dynamic Memory Allocation.
Chapter 13. Procedural programming vs OOP  Procedural programming focuses on accomplishing tasks (“verbs” are important).  Object-oriented programming.
Constructors CMSC 202. Object Creation Objects are created by using the operator new in statements such as… The following expression invokes a special.
CMSC 202 Lesson 14 Copy and Assignment. Warmup Write the constructor for the following class: class CellPhone { public: CellPhone(int number, const string&
1 Chapter 15-2 Pointers, Dynamic Data, and Reference Types Dale/Weems.
Data Structures Using C++1 Chapter 3 Pointers and Array-Based Lists.
Pointers and Dynamic Memory Allocation Copyright Kip Irvine 2003, all rights reserved. Revised 10/28/2003.
Concordia TAV 2002 Comp5421_421 Comp5421 Object Oriented Programming Using C++ Efficiently Lecture 4 (2) Tianxiang Shen Summer 2002 Department of Computer.
The Big Three Based on Weiss “Data Structures and algorithm Analysis CS240 Computer Science II.
Chapter 12: Pointers, Classes, Virtual Functions, and Abstract Classes.
 Classes in c++ Presentation Topic  A collection of objects with same properties and functions is known as class. A class is used to define the characteristics.
Object Oriented Programming Elhanan Borenstein Lecture #3 copyrights © Elhanan Borenstein.
CPSC 252 The Big Three Page 1 The “Big Three” Every class that has data members pointing to dynamically allocated memory must implement these three methods:
Data Structures Using C++1 Chapter 3 Pointers Dr. Liu.
Object Management. Constructors –Compiler-generated –The Initializer List –Copy Constructors –Single-arg (conversion ctors) The Assignment Operator.
OOP in C++ CS 124. Program Structure C++ Program: collection of files Source (.cpp) files be compiled separately to be linked into an executable Files.
Data Structures Using C++1 Chapter 3 Pointers and Array-Based Lists.
CS-1030 Dr. Mark L. Hornick 1 Basic C++ State the difference between a function/class declaration and a function/class definition. Explain the purpose.
C++ 程序语言设计 Chapter 12: Dynamic Object Creation. Outline  Object creation process  Overloading new & delete.
CMSC 202 Advanced Section Classes and Objects: Object Creation and Constructors.
Programming Languages and Paradigms C++. C++ program structure  C++ Program: collection of files Header files CPP source files  Files contain class,
More about Java Classes Writing your own Java Classes More about constructors and creating objects.
Chapter 1 C++ Basics Review (Section 1.4). Classes Defines the organization of a data user-defined type. Members can be  Data  Functions/Methods Information.
Dynamic Memory Review l what is static, automatic, dynamic variables? Why are dynamic(ally allocated) variables needed l what is program stack? Function.
Nirmalya Roy School of Electrical Engineering and Computer Science Washington State University Cpt S 223 – Advanced Data Structures C++ Review 2.
1 // SPECIFICATION FILE (dynarray.h) // Safe integer array class allows run-time specification // of size, prevents indexes from going out of bounds, //
Defining Data Types in C++ Part 2: classes. Quick review of OOP Object: combination of: –data structures (describe object attributes) –functions (describe.
1 Ugly Realities The Dark Side of C++ Chapter 12.
CS212: Object Oriented Analysis and Design Polymorphism (Using C++)
Memory Management.
Pointer to an Object Can define a pointer to an object:
Learning Objectives Pointers as dada members
Default Constructors A default constructor is a constructor that takes no arguments. If you write a class with no constructor at all, C++ will write a.
Lesson 14 Copy and Assignment
Class: Special Topics Copy Constructors Static members Friends this
Memberwise Assignment / Initialization
This pointer, Dynamic memory allocation, Constructors and Destructor
Dynamically Allocated Memory
CMSC 202 Templates.
Copy Assignment CSCE 121 J. Michael Moore.
9-10 Classes: A Deeper Look.
Class: Special Topics 2 For classes using memory allocation
Templates CMSC 202, Version 4/02.
Copy Assignment CSCE 121.
9-10 Classes: A Deeper Look.
Copy Constructors and Overloaded Assignment
Presentation transcript:

CMSC 202, Version 3/02 1 Copy Constructors and Overloaded Assignment

CMSC 202, Version 3/02 2 When do we make copies of an object? 1 ) When passing them to a function by value 2) When returning them from a function by value 3) When creating a new object that is initialized with a copy of an existing object 4) When assigning objects (x = y) 1.Items 1, 2 and 3 are handled by the copy constructor. 2.Item 4 is handled by overloading the assignment ( = ) operator.

CMSC 202, Version 3/02 3 What is a copy constructor? It’s a constructor – it’s used to construct new objects It does so by making a copy of an existing object We can do so explicitly Time t1 (12, 34, 56); // construct t1 Time t2 (t1); // construct t2 by copying t1 Time t3 = t1; // construct t3 by copying t1 The compiler may make copies when it needs them

CMSC 202, Version 3/02 4 Copy constructor syntax The function prototype for every copy constructor is of the form: ClassName::ClassName (const ClassName &); Why is it necessary to for this parameter to be passed by reference? Why can’t it be passed by value?

CMSC 202, Version 3/02 5 Why haven’t we seen this before? The compiler provides a default copy constructor which up until now has been sufficient. The default copy constructor simply copies each of the data members from the existing object into the new object This is not sufficient if one or more of the data members points to dynamically allocated memory

CMSC 202, Version 3/02 6 Dynamic Memory Within a Class Sometimes a data member of a class points to dynamically allocated memory. When this occurs, we have to answer the following questions 1.When will the dynamic memory be allocated? 2.When will the dynamic memory be deallocated? 3.What else is affected?

CMSC 202, Version 3/02 7 A Simple Array Class One class that is often defined in C++ applications and libraries is a “smart” array. It has features that the built-in array doesn’t have such as automatic initialization and automatically checking indices to prevent a core dump. Other features are also possible. We’ll use a such an array class to illustrate the impact of dynamic memory allocation within a class.

CMSC 202, Version 3/02 8 SmartArray class SmartArray { public: SmartArray ( int size = 100 ); // other members private: int _size; int *_theData; };

CMSC 202, Version 3/02 9 Using SmartArray Some SmartArray objects: SmartArray a1 (50);// 50 ints SmartArray a2 (200); // 200 ints SmartArray a3; // 100 ints by default

CMSC 202, Version 3/02 10 When Does the Memory Get Allocated? The obvious answer to this question is, “In the constructor.” SmartArray::SmartArray (int size) { _size = size; _theData = new int [_size]; for (int j = 0; j < _size; j++) _theData [ j ] = 0; }

CMSC 202, Version 3/02 11 A Picture of Memory Given the instantiation SmartArray a1(50); we get this picture of memory: a1: _size _theData

CMSC 202, Version 3/02 12 When Does the Memory Get Deallocated? The intuitive answer is, “In the destructor.” The compiler provides us with a default destructor that deallocates the private data members. But this is not sufficient. If we relied on the default destructor, we’d create a memory leak because the memory pointed to by _theData would not be freed. SmartArray::~SmartArray ( ) { delete [ ] _theData; }

CMSC 202, Version 3/02 13 What Else Is Affected? This time the answer is not so obvious. Consider the problems we want to avoid with dynamic memory: –dynamically allocated memory to which multiple things point (a probable logic error) –dynamically allocated memory to which nothing points (a memory leak) –a pointer that points “nowhere” (dangling pointer) All of these situations may arise when we wish to make a copy of a SmartArray object.

CMSC 202, Version 3/02 14 Effect of Default Copy Constructor (shallow copy) a1: _size _theData a2: 50 _size _theData Because the default copy constructor only copied the contents of _theData in a1 into _theData in a2, both point to the array allocated in a1. (Possible dangling pointer or other logic problem!)

CMSC 202, Version 3/02 15 The picture of memory we want (deep copy) a1: _size _theData a2: 50 _size _theData

CMSC 202, Version 3/02 16 SmartArray Copy Constructor SmartArray:: SmartArray (const SmartArray& array) { _size = array._size; _theData = new int [ _size ]; for (int j = 0; j < _size; j++ ) _theData[ j ] = array._theData [ j ]; }

CMSC 202, Version 3/02 17 When Is the Copy Constructor Invoked? Silently by the compiler when we Pass by value: void someFunction(SmartArray array); Return by value: SmartArray someFunction(parameters) { SmartArray temp; // code manipulating “temp” return (temp); }

CMSC 202, Version 3/02 18 When Is the Copy Constructor Invoked? (cont’d) Explicitly by us upon construction SmartArray a1; // constructing a2 as a copy of a1 SmartArray a2 = a1; OR SmartArray a2(a1);

CMSC 202, Version 3/02 19 What’s an assignment operator? The assignment operator is the function operator= It’s called when we assign one existing object to another existing object Time t1 (12, 34, 56); Time t2; t2 = t1; // object assignment

CMSC 202, Version 3/02 20 Why haven’t we heard of this before? (this may sound familiar) The compiler provides a default assignment operator, which up until now has been sufficient. The default assignment operator simply copies each of the data members from the existing object on the right hand side into the existing object on the left hand side. This is not sufficient if one or more of the data members points to dynamically allocated memory

CMSC 202, Version 3/02 21 Assigning SmartArray Objects Consider the following code: SmartArray a1 ( 50 ); SmartArray a2 ( 50 ); // some code to manipulate a1 // some code to manipulate a2 // now assign a1 to a2 a2 = a1;

CMSC 202, Version 3/02 22 Assignment Operator The statement a2 = a1; calls the assignment operator ( operator= ) for the SmartArray class. If we don’t provide operator=, the compiler uses the default behavior Like the default copy constructor, the default assignment operator does a member-by-member (shallow) assignment.

CMSC 202, Version 3/02 23 Default Assignment Code Conceptually, the default assignment operator for SmartArray contains the following code _size = rhs._size; _theData = rhs._theData;

CMSC 202, Version 3/02 24 Prior To Assignment We have a picture something like this: a1: _size _theData a2: 50 _size _theData a2:

CMSC 202, Version 3/02 25 After Default Assignment a1: _size _theData a2: 50 _size _theData Because the default assignment operator only copied the contents of _theData in a1 into _theData in a2, both point to the array allocated in a1.

CMSC 202, Version 3/02 26 In Fact, It’s Worse What happened to the memory that a2 used to point to? We’ve also caused a memory leak

CMSC 202, Version 3/02 27 We want this picture without a memory leak a1: _size _theData a2: _size _theData

CMSC 202, Version 3/02 28 SmartArray::operator= (A First Attempt) void SmartArray::operator= (const SmartArray& rhs) { // free the memory for the current array delete [ ] _theData; // now make a deep copy of the rhs _size = rhs._size; _theData = new int [ _size ]; for (int j = 0; j < _size; j++ ) _theData[ j ] = rhs._theData [ j ]; }

CMSC 202, Version 3/02 29 We’re Not Done Yet Recall that it’s desirable for our objects to emulate the built-in types. In particular, we can do the following with built-in types: int bob, mary, sally; bob = mary = sally; // statement 1 bob = bob; // statement 2 (bob = mary) = sally; // statement 3 So our objects should also support these statements.

CMSC 202, Version 3/02 30 Analysis of These Statements 1.Statement 1 is a common thing to do – it’s called cascading assignment. To accomplish this, operator= must return a reference to a SmartArray. 2.Statement 2 is meaningless, but allowable by the language. To support this without causing a problem, operator= must check for this case (this is called self-assignment). 3.Statement 3 is odd, but valid. To support this, operator= must return a non-const reference to a SmartArray. (Debatable -- your text does not do this.)

CMSC 202, Version 3/02 31 SmartArray& // non-const reference SmartArray::operator= (const SmartArray& rhs) { if (this != &rhs) // not bob = bob { // free the memory for the current array delete [ ] _theData; // make a copy of the rhs _size = rhs._size; _theData = new int [ _size ]; for (int j = 0; j < _size; j++ ) _theData[ j ] = rhs._theData [ j ]; } return (*this); // for cascading assignment }

CMSC 202, Version 3/02 32 Exercises For the Student 1) For the following statements, determine if the method called is a “regular” constructor, copy constructor, or operator=. a. SmartArray a1; b. SmartArray a2( a1 ); c. SmartArray a3 = a2; d. SmartArray a4(100 ); e. a1 = a4;

CMSC 202, Version 3/02 33 Exercises For the Student (con’t) 2. Suppose operator= for SmartArray did not contain the statement if (this != &rhs); i.e., we allowed self-assignment. Draw the picture of memory that results from the following statements: SmartArray a1( 3 ); a1 = a1;