1 / 16

CMSC 202

CMSC 202. Lesson 14 Copy and Assignment. Warmup. Write the constructor for the following class: class CellPhone { public: CellPhone( int number, const string& name ); private: int* m_number; string* m_name; };. Copying Objects…. When do we make copies? Pass by value

derora
Download Presentation

CMSC 202

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CMSC 202 Lesson 14 Copy and Assignment

  2. Warmup • Write the constructor for the following class: class CellPhone { public: CellPhone( int number, const string& name ); private: int* m_number; string* m_name; };

  3. Copying Objects… • When do we make copies? • Pass by value • Return by value • Assignment • New object initialized with existing object • Haven’t seen this….yet

  4. Copy Constructor • Initialize an object based on an existing object • Examples: int a = 7; int b(a); // Copy constructor Shoe shoeOfMJ( “Nike”, 16 ); Shoe myShoe( shoeOfMJ ); // Copy

  5. Copy Constructor • Use when dynamic memory is allocated • Syntax: • Prototype: ClassName( const ClassName& obj ); • Implementation: ClassName::ClassName( const ClassName& obj ) { // code to dynamically allocate data }

  6. Why do we care? • Remember • Assignment (by default) makes a direct copy of data members… • With dynamic memory – this would be copying pointers 7 Class ------------- int *data1 string *data2 Object *data3 Class ------------- int *data1 string *data2 Object *data3 abc Foo bar

  7. What do we want? • Each object should have own memory allocated to members… 7 Class ------------- int *data1 string *data2 Object *data3 7 Class ------------- int *data1 string *data2 Object *data3 abc abc Foo bar Foo bar

  8. Example class Shoe { public: Shoe( const Shoe& shoe ); private: int *m_size; string *m_brand; }; Shoe::Shoe( const Shoe& shoe ) { m_size = new int( *shoe.m_size ); m_brand = new string( *shoe.m_brand ); } What’s going on here?

  9. What else? • Assignment Operator • Define if using dynamic memory • Syntax: • Prototype: ClassName& operator=( const ClassName& obj ); • Definition: ClassName& ClassName::operator=( const ClassName& obj ) { // Deallocate existing memory, if necessary // Allocate new memory }

  10. Shoe& Shoe::operator=( const Shoe& shoe ) { m_size = new int(*shoe.m_size); m_brand = new string(*shoe.m_brand); } // In main() Shoe a(7, “abc”); Shoe b(4, “edf”); b = a; What’s wrong with this? 7 Shoe a ------------- int *m_size string *m_brand abc Shoe b ------------- int *m_size string *m_brand 4 edf What happened to the memory b was pointing to first???

  11. What’s wrong with this? void Shoe::operator=( const Shoe& shoe ) { *m_size = *shoe.m_size; *m_brand = *shoe.m_brand; } Shoe a(7, “abc”); Shoe b(4, “edf”); Shoe c(9, “ghi”); c = b = a; How does the c = b work, when b = a returns nothing??

  12. Fixed Shoe& Shoe::operator=( const Shoe& shoe ) { *m_size = *shoe.m_size; *m_brand = *shoe.m_brand; return *this; } Shoe a(7, “abc”); Shoe b(4, “edf”); Shoe c(9, “ghi”); c = b = a; What’s this? this – a pointer to the current object

  13. Self-Assignment class RentalSystem { public: // Assume constructor, other methods… RentalSystem& operator=( const RentalSystem & rs ) private: Customer *m_customers; int m_nbrOfCustomers; }; RentalSystem& RentalSystem::operator=( const RentalSystem & rs ) { delete [] m_customers; m_customers = new Customer[rs.m_nbrOfCustomers]; for (int i = 0; i < rs.m_nbrOfCustomers; ++i) m_customers[i] = rs.m_customers[i]; return *this; } What happens when you do the following? RentalSystem r; // Add customers… r = r;

  14. Protect from Self-assignment RentalSystem& RentalSystem::operator=( const RentalSystem & rs ) { // If this is NOT the same object as rs if ( this != &rs ) { delete [] m_customers; m_customers = new Customer[rs.m_nbrOfCustomers]; for (int i = 0; i < rs.m_nbrOfCustomers; ++i) m_customers[i] = rs.m_customers[i]; } return *this; }

  15. Practice • Implement copy constructor and = operator • class Stapler • { • public: • _______________ // copy constructor • _______________ // operator= • private: • int *m_nbrStaples; • };

  16. Challenge • Create a BoxOfStaplers class • Implement copy constructor • Implement operator= • Hint: • Take a look at the lecture notes for the SmartArray class!

More Related