@ George Wolberg, 2016 1 CSC212 Data Structure Lecture 6 Dynamic Classes and the Law of the Big Three Instructor: George Wolberg Department of Computer.

Slides:



Advertisements
Similar presentations
Introduction to Programming Lecture 39. Copy Constructor.
Advertisements

Review of Stacks and Queues Dr. Yingwu Zhu. Our Focus Only link-list based implementation of Stack class Won’t talk about different implementations of.
@ Zhigang Zhu, CSC212 Data Structure - Section RS Lectures 6/7 Pointers and Dynamic Arrays Instructor: Zhigang Zhu Department of Computer Science.
Reviews for Exam 1 Chapter 1-4 CSc 212 Data Structures, Sec FG CCNY, Fall 2010.
@ Zhigang Zhu, CSC212 Data Structure - Section FG Lecture 8 Dynamic Classes and the Law of the Big Three Instructor: Zhigang Zhu Department.
Reviews for Exam 1 Chapter 1-4 CS 211 Data Structures MHC, 2007.
@ Zhigang Zhu, CSC212 Data Structure - Section FG Lecture 10 The Bag and Sequence Classes with Linked Lists Instructor: Zhigang Zhu Department.
Pointers1 Pointers & Dynamic Arrays Allocating memory at run-time.
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++
C++ Programming: Program Design Including Data Structures, Fourth Edition Chapter 13: Pointers, Classes, Virtual Functions, and Abstract Classes.
Review for Midterm Chapter 1-9 CSc 212 Data Structures.
Pointer Data Type and Pointer Variables
C++ Programming: From Problem Analysis to Program Design, Fourth Edition Chapter 14: Pointers, Classes, Virtual Functions, and Abstract Classes.
Xiaoyan Li, CSC211 Data Structures Lecture 10 The Bag and Sequence Classes with Linked Lists Instructor: Prof. Xiaoyan Li Department of Computer.
Pointers Pointer a data type stores a memory address points to whatever the memory location contains A pointer is a variable that can store a memory address.
Edgardo Molina, CSC212 Data Structure - Section AB Lectures 6/7 Pointers and Dynamic Arrays Instructor: Edgardo Molina Department of Computer Science.
1 Inside the Vector Class: with additional needed methods CPS212CPS212 Gordon College.
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.
Data Structures Using C++ 2E Chapter 3 Pointers. Data Structures Using C++ 2E2 Objectives Learn about the pointer data type and pointer variables Explore.
Chapter 12: Pointers, Classes, Virtual Functions, and Abstract Classes.
Nyhoff, ADTs, Data Structures and Problem Solving with C++, Second Edition, © 2005 Pearson Education, Inc. All rights reserved Stacks.
Review of Stacks and Queues Dr. Yingwu Zhu. How does a Stack Work? Last-in-First-out (LIFO) data structure Adding an item Push operation Removing an item.
CMSC 202, Version 3/02 1 Copy Constructors and Overloaded Assignment.
Edgardo Molina, CSC212 Data Structure - Section AB Lecture 8 Dynamic Classes and the Law of the Big Three Instructor: Edgardo Molina Department.
Data Structures Using C++1 Chapter 3 Pointers and Array-Based Lists.
1 CSC212 Data Structure Lecture 4 Container Classes Instructor: George Wolberg Department of Computer Science City College of New York.
Xiaoyan Li, CSC211 Data Structures Lecture 8 Dynamic Classes and the Law of the Big Three Instructor: Prof. Xiaoyan Li Department of Computer Science.
On dynamic memory and classes ● We previously had only discussed dynamic memory in regards to structs and dynamic arrays. ● However, they can be used (to.
Memory Management.
Pointers and Dynamic Arrays
Learning Objectives Pointers as dada members
Copy Constructor / Destructors Stacks and Queues
Chapter 13: Pointers, Classes, Virtual Functions, and Abstract Classes
Andy Wang Object Oriented Programming in C++ COP 3330
Programming with ANSI C ++
Inheritance and Big O And your first reading assignment
Pointers, Polymorphism, and Memory Allocation
CMPE 135: Object-Oriented Analysis and Design October 17 Class Meeting
Class: Special Topics Copy Constructors Static members Friends this
Chapter 1-4 CSc 212 Data Structures, Sec AB CCNY, Spring 2012
Chapter 10: Pointers Starting Out with C++ Early Objects Ninth Edition
This pointer, Dynamic memory allocation, Constructors and Destructor
The Bag and Sequence Classes with Linked Lists
Dynamically Allocated Memory
Chapter 12: Pointers, Classes, Virtual Functions, and Abstract Classes
Array Lists Chapter 6 Section 6.1 to 6.3
Classes with Dynamically Allocated Data
Chapter 15 Pointers, Dynamic Data, and Reference Types
Chapter 15 Pointers, Dynamic Data, and Reference Types
CSC212 Data Structure - Section FG
Indirection.
Dynamic Data Structures
The Destructor and the Assignment Operator
CS148 Introduction to Programming II
9-10 Classes: A Deeper Look.
CSC212 Data Structure - Section RS
Data Structures and Algorithms Memory allocation and Dynamic Array
Class: Special Topics 2 For classes using memory allocation
The Constructors Lecture 7 Fri, Feb 2, 2007.
ENERGY 211 / CME 211 Lecture 17 October 29, 2008.
Rule of Three Part 1 & 2.
CS 144 Advanced C++ Programming April 30 Class Meeting
9-10 Classes: A Deeper Look.
Copy Constructors and Overloaded Assignment
Chapter 1-4 CSc 212 Data Structures, Sec FG CCNY, 2009
SPL – PS3 C++ Classes.
Presentation transcript:

@ George Wolberg, CSC212 Data Structure Lecture 6 Dynamic Classes and the Law of the Big Three Instructor: George Wolberg Department of Computer Science City College of New York

@ George Wolberg, Why Dynamic Classes p Limitation of our bag class p bag::CAPACITY constant determines the capacity of every bag p wasteful and hard to reuse p Solution: p provide control over size in running time, by p pointers and dynamic memory p => dynamic arrays p => dynamic classes

@ George Wolberg, Dynamic Classes New Features (Ch 4.3–4) p Pointers Member Variables p Dynamic Memory Allocation (where and how) p Value Semantics (what’s new?) p assignment operator overloading p your own copy constructor p Introducing Destructor p Conclusion: the Law of the Big Three

@ George Wolberg, Pointer Member Variable  The Static bag  The Dynamic bag // From bag1.h in Section 3.1 class bag { public: static const size_t CAPACITY = 20;... private: value_type data[CAPACITY]; size_type used; }; // From bag2.h in Section 4.3 class bag { public:... private: value_type *data; size_type used; size_type capacity; };

@ George Wolberg, Invariant of the Dynamic bag  the number of items is in the member variable used  The actual items are stored in a partially filled array. The array is a dynamic array, pointed to by the pointer variable data  The total size of the dynamic array is the member variable capacity p Invariant is about rules of implementation...

@ George Wolberg, Allocate Dynamic Memory: Where? p In p In Old Member Functions  constructor  constructor – how big is the initial capacity?  insert  insert – if bag is full, how many more?  +/+=  +/+= operators operators – how to combine two bags? pNew Member Functions  reserve  reserve – explicitly adjust the capacity pExample pconstructor with default size

@ George Wolberg, Allocate Dynamic Memory: How?  In constructor : p why initialize? p how? p default p specific size // From bag2.h in Section 4.3 class bag { public: static const size_t DEFAULT_CAPACITY = 20; bag(size_type init_cap = DEFAULT_CAPACITY);... private: value_type *data; size_type used; size_type capacity; }; // From implementation file bag2.cpp bag::bag(size_type init_cap) { data = new value_type[init_cap]; capacity = init_cap; used = 0; }

@ George Wolberg, Value Semantics p Assignment operator p y = x; p Copy constructor p bag y(x); // bag y = x; Automatic assignment operator and copy constructor p copy all the member variables (data, used, capacity) from object x to object y p but our days of easy contentment are done!

@ George Wolberg, Failure in auto assignment operator x bag x(4), y(5); x.insert(18); x.insert(19); y=x; x.insert(20); capacity used data y50964 ???? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] Question: What will happen after executing lines 2 – 5?

@ George Wolberg, Failure in auto assignment operator x bag x(4), y(5); x.insert(18); x.insert(19); y=x; x.insert(20); capacity used data y ?? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] Question: What will happen after executing lines 2 – 5?

@ George Wolberg, Failure in auto assignment operator x bag x(4), y(5); x.insert(18); x.insert(19); y=x; x.insert(20); capacity used data y ?? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] Question: What will happen after executing lines 2 – 5? lost memory

@ George Wolberg, Failure in auto assignment operator x bag x(4), y(5); x.insert(18); x.insert(19); y=x; x.insert(20); capacity used data y ? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] Consequence: Change to x’ array will also change y’s array lost memory

@ George Wolberg, If we want y to have its own dynamic array x bag x(4), y(5); x.insert(18); x.insert(19); y=x; x.insert(20); capacity used data y ?? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4]

@ George Wolberg, Dynamic memory allocation is needed x bag x(4), y(5); x.insert(18); x.insert(19); y=x; x.insert(20); capacity used data y ?? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] Answer: overloading the assignment operator = memory de-allocated 1819??

@ George Wolberg, Dynamic memory allocation is needed x bag x(4), y(5); x.insert(18); x.insert(19); y=x; x.insert(20); capacity used data y ? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] Answer: overloading the assignment operator = memory de-allocated 1819??

@ George Wolberg, Solution: overloading assignment operator p Your own assignment operator p C++ Requires the overloaded assignment operator to be a member function bag x, y ; // OR bag x(4), y(5); // OR.... y=x; // y.operator=(x); void bag::operator=(const bag& source) // Postcondition: The bag that activated this function has the same items and capacity as source A 5-minute Quiz: write your own implementation - turn in // From bag2.h in Section 4.3 class bag { public: static const size_t DEFAULT_CAPACITY = 20; bag(size_type init_cap = DEFAULT_CAPACITY);... private: value_type *data; size_type used; size_type capacity; }; // From implementation file bag2.cpp bag::bag(size_type init_cap) { data = new value_type[init_cap]; capacity = init_cap; used = 0; }

@ George Wolberg, Implementation of operator= p y = x; p y  *this p x  source void bag::operator =(const bag& source) // Library facilities used: algorithm { value_type *new_data; // Check for possible self-assignment: if (this == &source) return; // If needed, allocate an array with a different size: if (capacity != source.capacity) { new_data = new value_type[source.capacity]; delete [ ] data; // make sure all valid before delete!!! data = new_data; capacity = source.capacity; } // Copy the data from the source array: used = source.used; copy(source.data, source.data + used, data); }

@ George Wolberg, The 2 nd part of the value semantics copy constructor

@ George Wolberg, Auto Copy Constructor: shallow copy x bag x(4) bag y(x); x.insert(18); x.insert(19); capacity used data y40984 ???? [0] [1] [2] [3] [0] [1] [2] [3] The only difference with auto assignment is: y does not have its own data

@ George Wolberg, Failure in auto copy constructor x bag x(4); bag y(x); x.insert(18); x.insert(19); capacity used data y ?? [0] [1] [2] [3] [0] [1] [2] [3] change to x also changes y

@ George Wolberg, Deep copy: providing your own copy constructor p Questions on Implementation (homework!) p do you need to check self-copy p bag y(x); // never have bag y(y); p do you need to delete old bag? p Questions on Usage p 4 different ways that copy constructor is used bag::bag(const bag& source) // Postcondition: The bag that has been constructed has the same items and capacity as source

@ George Wolberg, Four common situations p Declaration bag y(x); bag y(x); p Declaration with Alternate Syntax bag y = x ; bag y = x ; p Returning an object from a function bag union(const bag& s1, const bag& s2); bag union(const bag& s1, const bag& s2); p Value parameter is an object void temp_bag_copy(bag clone); void temp_bag_copy(bag clone);

@ George Wolberg, What’s missing? allocate dynamic memory via new, take care of the value semantics,....?

@ George Wolberg, De-allocation of dynamic memory p Return an object’s dynamic memory to the heap when the object is no longer in use p Where and How? – Two ways p Take care of it yourself  delete dynamic data of an object after you’re done with it p let the program do it automatically p destructor

@ George Wolberg, Destructor p The primary purpose is to return an object’s dynamic memory to the heap, and to do other “cleanup” p Three unique features of the destructor p The name of the destructor is always ~ followed by the class name; p No parameters, no return values; p Activated automatically whenever an object becomes inaccessible Question: when this happens? Question: when this happens? bag::~bag() { delete [ ] data; }

@ George Wolberg, Destructor p Some common situations causing automatic destructor activation p Upon function return, objects as local variables destroyed; p Upon function return, objects as value parameters destroyed; p when an object is explicitly deleted Question: shall we put destructor in how-to-use-a- bag documentation? Question: shall we put destructor in how-to-use-a- bag documentation? bag::~bag() { delete [ ] data; }

@ George Wolberg, The Law of the Big Three p Using dynamic memory requires the following three things all together p a destructor p a copy constructor (and of course an ordinary one) p an overloaded assignment operator p In other words, the three functions come in a set – either you need to write all three yourself, or you can rely on the compiler-supplied automatic versions of all the three.

@ George Wolberg, What will happen if not? If we only have a constructor and a destructor, but do not provide a copy constructor and an overloaded assignment operator

@ George Wolberg, Importance of the Law of Big-3 bag *x, *y; x = new bag(4); y = new bag(5); x->insert(18); x->insert(19); *y = *x; delete x; y->insert(20); Question: What will happen after executing lines 1 – 8? // destructor bag::~bag() { delete [ ] data; } // constructor bag::bag(size_type init_cap) { data = new value_type[init_cap]; capacity = init_cap; used = 0; }

@ George Wolberg, Importance of the Law of Big-3 *x*x*x*x bag *x, *y; x = new bag(4); y = new bag(5); x->insert(18); x->insert(19); *y = *x; delete x; y->insert(20); capacity used data *y*y*y*y50964 ???? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] allocate memory for objects (*x, *y) and their dynamic arrays // From implementation file bag2.cpp bag::bag(size_type init_cap) { data = new value_type[init_cap]; capacity = init_cap; used = 0; }

@ George Wolberg, Importance of the Law of Big-3 bag *x, *y; x = new bag(4); y = new bag(5); x->insert(18); x->insert(19); *y = *x; delete x; y->insert(20); capacity used data ?? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] Insert two items in the dynamic array of object *x *x*x*x*x *y*y*y*y

@ George Wolberg, Importance of the Law of Big capacity used data ?? ????? [0] [1] [2] [3] [0] [1] [2] [3] [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] automatic assignment only copies three variables (capacity, used and data) from *x to *y lost memory bag *x, *y; x = new bag(4); y = new bag(5); x->insert(18); x->insert(19); *y = *x; delete x; y->insert(20); *x*x*x*x *y*y*y*y

@ George Wolberg, Importance of the Law of Big ????? [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] Deleting x will also delete the dynamic array of *x by calling the destructor dangling pointer lost memory bag *x, *y; x = new bag(4); y = new bag(5); x->insert(18); x->insert(19); *y = *x; delete x; y->insert(20); bag::~bag() { delete [ ] data; } *y*y*y*y

@ George Wolberg, Importance of the Law of Big-3 *y*y*y*y ????? [0] [1] [2] [3] [4] [0] [1] [2] [3] [4] Your program crashes: *y needs its own copy of data !!! dangling pointer lost memory bag *x, *y; x = new bag(4); y = new bag(5); x->insert(18); x->insert(19); *y = *x; delete x; y->insert(20);

@ George Wolberg, Reading and Programming Assignments p Putting pieces together p bag2.h, bag2.cpp both in textbook and online online p Self-test exercises p p After-class reading (string) p Section 4.5, Self-Test (within exam scope)