copy constructor
play

Copy Constructor 1 Copy Constructor 1. Initialize one object from - PowerPoint PPT Presentation

Copy Constructor 1 Copy Constructor 1. Initialize one object from another of the same type Creates a new object MyClass one; as a copy of another one MyClass two = one; More explicitly Compiler will provide one MyClass


  1. Copy Constructor � 1

  2. Copy Constructor • 1. Initialize one object from another of the same type • Creates a new object MyClass one; 
 as a copy of another one MyClass two = one; 
 More explicitly 
 Compiler will provide one MyClass one; 
 but may not appropriate MyClass two(one); // Identical to above. 
 for complex objects • 2. Copy an object to pass by value as an argument to a function 
 void MyFunction(MyClass arg) { 
 /* ... */ 
 } 
 • 3. Copy an object to be returned by a function 
 MyClass MyFunction() { 
 MyClass mc; 
 return mc; 
 } � 2

  3. Deep vs Shallow Copy � 3

  4. Deep vs Shallow Copy � 4

  5. Overloaded operator= • MyClass one; • //Stuff here 
 Instantiation: copy constructor is called MyClass two = one; • IS DIFFERENT FROM Assignment, NOT • MyClass one, two; instantiation: no constructor • //Stuff here 
 is called, must overload operator= to avoid two = one; shallow copy � 5

  6. Copy Constructor Implementation A constructor whose #include “LinkedBag.hpp” 
 parameter is an template<typename ItemType> 
 LinkedBag<ItemType>::LinkedBag(const LinkedBag<ItemType>& a_bag) 
 object of the { 
 same class item_count_ = a_bag.item_count_; 
 Node<ItemType>* orig_chain_ptr = a_bag.head_ptr_;//Points to nodes in original chain if (orig_chain_ptr == nullptr) 
 Called when object is initialized head_ptr_ = nullptr; // Original bag is empty 
 with a copy of another object, e.g. else 
 LinkedBag<string> my_bag { 
 Copy first node = your_bag; // Copy first node 
 head_ptr_ = new Node<ItemType(); 
 Two traversing pointers head_ptr_->setItem(orig_chain_ptr->getItem()); One to new chain , one // Copy remaining nodes 
 to original chain Node<ItemType>* new_chain_ptr = head_ptr_;//Points to last node in new chain 
 orig_chain_ptr = orig_chain_ptr->getNext();//Advance original-chain pointer 
 while (orig_chain_ptr != nullptr) 
 Copy item from current node while { // Get next item from original chain 
 ItemType next_item = orig_chain_ptr->getItem(); 
 Create new node with item // Create a new node containing the next item 
 Node<ItemType>* new_node_ptr = new Node<ItemType>(next_item); 
 // Link new node to end of new chain 
 Connect new node to new chain new_chain_ptr->setNext(new_node_ptr); // Advance pointer to new last node 
 Advance pointer traversing new chain new_chain_ptr = new_chain_ptr->getNext(); 
 // Advance original-chain pointer 
 orig_chain_ptr = orig_chain_ptr->getNext(); 
 Advance pointer traversing original chain } // end while 
 new_chain_ptr->setNext(nullptr); // Flag end of chain 
 } // end if 
 Signal last node � 6 } // end copy constructor

  7. Deep vs // Copy first node 
 Shallow head_ptr_ = new Node<ItemType>(); 
 head_ptr_->setItem(orig_chain_ptr->getItem()); // Copy remaining nodes 
 Copy Node<ItemType>* new_chain_ptr = head_ptr_; // Points to last node in new chain 
 orig_chain_ptr = orig_chain_ptr->getNext(); orig_chain_ptr new_chain_ptr � 7

  8. Deep vs // Copy first node 
 Shallow head_ptr_ = new Node<ItemType>(); 
 head_ptr_->setItem(orig_chain_ptr->getItem()); // Copy remaining nodes 
 Copy Node<ItemType>* new_chain_ptr = head_ptr_; // Points to last node in new chain 
 orig_chain_ptr = orig_chain_ptr->getNext(); orig_chain_ptr new_chain_ptr � 8

  9. Deep vs while (orig_chain_ptr != nullptr) { 
 // Get next item from original chain 
 ItemType next_item = orig_chain_ptr->getItem(); Shallow //Create a new node containing the next item 
 Node<ItemType>* new_node_ptr = new Node<ItemType>(next_item); //Link new node to end of new chain 
 Copy new_chain_ptr->setNext(new_node_ptr); // Advance pointer to new last node 
 new_chain_ptr = new_chain_ptr->getNext(); 
 / Advance original-chain pointer 
 orig_chain_ptr = orig_chain_ptr->getNext(); 
 } orig_chain_ptr new_chain_ptr � 9

  10. Deep vs while (orig_chain_ptr != nullptr) { 
 // Get next item from original chain 
 ItemType next_item = orig_chain_ptr->getItem(); Shallow //Create a new node containing the next item 
 Node<ItemType>* new_node_ptr = new Node<ItemType>(next_item); //Link new node to end of new chain 
 Copy new_chain_ptr->setNext(new_node_ptr); // Advance pointer to new last node 
 new_chain_ptr = new_chain_ptr->getNext(); 
 / Advance original-chain pointer 
 orig_chain_ptr = orig_chain_ptr->getNext(); 
 } orig_chain_ptr new_chain_ptr � 10

  11. Deep vs while (orig_chain_ptr != nullptr) { 
 // Get next item from original chain 
 ItemType next_item = orig_chain_ptr->getItem(); Shallow //Create a new node containing the next item 
 Node<ItemType>* new_node_ptr = new Node<ItemType>(next_item); //Link new node to end of new chain 
 Copy new_chain_ptr->setNext(new_node_ptr); // Advance pointer to new last node 
 new_chain_ptr = new_chain_ptr->getNext(); 
 / Advance original-chain pointer 
 orig_chain_ptr = orig_chain_ptr->getNext(); 
 } orig_chain_ptr new_chain_ptr � 11

  12. Deep vs while (orig_chain_ptr != nullptr) { 
 // Get next item from original chain 
 ItemType next_item = orig_chain_ptr->getItem(); Shallow //Create a new node containing the next item 
 Node<ItemType>* new_node_ptr = new Node<ItemType>(next_item); //Link new node to end of new chain 
 Copy new_chain_ptr->setNext(new_node_ptr); // Advance pointer to new last node 
 new_chain_ptr = new_chain_ptr->getNext(); 
 / Advance original-chain pointer 
 orig_chain_ptr = orig_chain_ptr->getNext(); 
 } orig_chain_ptr new_chain_ptr � 12

  13. Deep vs while (orig_chain_ptr != nullptr) { 
 // Get next item from original chain 
 ItemType next_item = orig_chain_ptr->getItem(); Shallow //Create a new node containing the next item 
 Node<ItemType>* new_node_ptr = new Node<ItemType>(next_item); //Link new node to end of new chain 
 Copy new_chain_ptr->setNext(new_node_ptr); // Advance pointer to new last node 
 new_chain_ptr = new_chain_ptr->getNext(); 
 / Advance original-chain pointer 
 orig_chain_ptr = orig_chain_ptr->getNext(); 
 } orig_chain_ptr new_chain_ptr � 13

  14. Deep vs while (orig_chain_ptr != nullptr) { 
 // Get next item from original chain 
 ItemType next_item = orig_chain_ptr->getItem(); Shallow //Create a new node containing the next item 
 Node<ItemType>* new_node_ptr = new Node<ItemType>(next_item); //Link new node to end of new chain 
 Copy new_chain_ptr->setNext(new_node_ptr); // Advance pointer to new last node 
 new_chain_ptr = new_chain_ptr->getNext(); 
 / Advance original-chain pointer 
 orig_chain_ptr = orig_chain_ptr->getNext(); 
 } orig_chain_ptr new_chain_ptr

  15. Deep vs while (orig_chain_ptr != nullptr) { 
 // Get next item from original chain 
 ItemType next_item = orig_chain_ptr->getItem(); Shallow //Create a new node containing the next item 
 Node<ItemType>* new_node_ptr = new Node<ItemType>(next_item); //Link new node to end of new chain 
 Copy new_chain_ptr->setNext(new_node_ptr); // Advance pointer to new last node 
 new_chain_ptr = new_chain_ptr->getNext(); 
 / Advance original-chain pointer 
 orig_chain_ptr = orig_chain_ptr->getNext(); 
 } orig_chain_ptr new_chain_ptr � 15

  16. Deep vs while (orig_chain_ptr != nullptr) { 
 // Get next item from original chain 
 ItemType next_item = orig_chain_ptr->getItem(); Shallow //Create a new node containing the next item 
 Node<ItemType>* new_node_ptr = new Node<ItemType>(next_item); //Link new node to end of new chain 
 Copy new_chain_ptr->setNext(new_node_ptr); // Advance pointer to new last node 
 new_chain_ptr = new_chain_ptr->getNext(); 
 / Advance original-chain pointer 
 orig_chain_ptr = orig_chain_ptr->getNext(); 
 } orig_chain_ptr new_chain_ptr � 16

  17. Efficiency Considerations Every time you pass or return an object by value: 
 - Call copy constructor 
 - Call destructor For linked chain: 
 - Traverse entire chain to copy ( n “ steps ” ) 
 - Traverse entire chain to destroy ( n “ steps ” ) Preferred: 
 myFunction(const MyClass& object); � 17

  18. The Class LinkedBag #ifndef LINKED_BAG_H_ 
 #define LINKED_BAG_H_ #include "BagInterface.hpp" 
 #include “Node.hpp" E ffi cient template<typename ItemType> 
 class LinkedBag 
 Expensive THINK { 
 WORST CASE public: 
 LinkedBag(); 
 LinkedBag(const LinkedBag<ItemType>& a_bag); // Copy constructor 
 ~LinkedBag(); // Destructor 
 int getCurrentSize() const; 
 bool isEmpty() const; 
 bool add(const ItemType& new_entry); 
 bool remove(const ItemType& an_entry); 
 void clear(); 
 bool contains(const ItemType& an_entry) const; 
 int getFrequencyOf(const ItemType& an_entry) const; 
 std::vector<ItemType> toVector() const; private: 
 Node<ItemType>* head_ptr_; // Pointer to first node 
 int item_count_; // Current count of bag items // Returns either a pointer to the node containing a given entry 
 // or the null pointer if the entry is not in the bag. 
 Node<ItemType>* getPointerTo(const ItemType& target) const; 
 }; // end LinkedBag #include “LinkedBag.cpp" 
 � 18 � 18 #endif //LINKED_BAG_H_

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend