computer science ii for majors
play

Computer Science II for Majors Lecture 13 Friends and More Dr. - PowerPoint PPT Presentation

CMSC202 Computer Science II for Majors Lecture 13 Friends and More Dr. Katherine Gibson www.umbc.edu Last Class We Covered Linked Lists Traversal Creation Insertion Deletion 2 www.umbc.edu Any Questions from Last


  1. CMSC202 Computer Science II for Majors Lecture 13 – Friends and More Dr. Katherine Gibson www.umbc.edu

  2. Last Class We Covered • Linked Lists – Traversal – Creation – Insertion – Deletion 2 www.umbc.edu

  3. Any Questions from Last Time? www.umbc.edu

  4. Today’s Objectives • To cover some miscellaneous topics: – Friends – Destructors • Freeing memory in a structure – Copy Constructors – Assignment Operators 4 www.umbc.edu

  5. Friend Functions and Classes www.umbc.edu

  6. Why Have Friends? • Giving direct access to private variables is not possible if the function is not a class method • But using accessors can be cumbersome, especially for something like an overloaded insertion operator ( << ) • Use a “friend” function to give direct access, even though the function is not called on an object of that class 6 www.umbc.edu

  7. Friend Functions • Non-member functions that have member-style access • Function is declared inside the class – Will be public regardless of specifier • Designate using the friend keyword friend void aFriendFunction(); 7 www.umbc.edu

  8. Friend Classes • Classes can also be declared to be friends of another class class Milo { the Otis class now has access to all of public: the private members friend class Otis; of the Milo class }; class Otis { ... }; 8 www.umbc.edu

  9. Forward Declarations • When one class references another in its definition, we need a forward declaration – Tell the compiler it exists, without defining it • In order to reference the Otis class before it’s defined, we need something similar: class Otis; – before the Milo class declaration 9 www.umbc.edu

  10. Using Friends • Why give access to private member variables? • Useful for testing functionality • Increased speed • Operator overloading • Enhances encapsulation – A function being a friend is specified in the class 10 www.umbc.edu

  11. Destructors www.umbc.edu

  12. Destructors • Destructors are the opposite of constructors • Used when delete() is called on an instance of a user-created class • Compiler automatically provides one for you – Does not take into account dynamic memory – If your class uses dynamic memory, you must write a better destructor to prevent memory leaks! 12 www.umbc.edu

  13. Destructor Example: Date • Let’s say we have a new member variable of our Date class called ‘ m_next_holiday ’ – Pointer to a string with name of the next holiday class Date { private: int m_month; int m_day; int m_year; string *m_next_holiday ; }; 13 www.umbc.edu

  14. Destructor Example: Date • We will need to update the constructor Date::Date (int m, int d, int y, string next_holiday) { SetMonth(m); What other changes do we need to SetDay(d); make to a class when adding a new member variable? SetYear(y); m_next_holiday = new string; *m_next_holiday = next_holiday; } 14 www.umbc.edu

  15. Creating a Destructor • We also now need to create a destructor of our own: ~Date(); // our destructor • Destructors must have a tilde at the front • Similar to a constructor: – Destructor has no return type – Same name as the class 15 www.umbc.edu

  16. Basic Destructor Definition • The destructor needs to free all of the dynamically allocated memory – Otherwise we will have memory leaks • Most basic version of a destructor Date::~Date() { delete m_next_holiday; } 16 www.umbc.edu

  17. Security and Carefulness Date::~Date() { delete m_next_holiday; } • This works, but it isn’t very secure for the data, and it isn’t very careful with our pointers – What if someone gets access to this memory later? – What if my code tries to access m_next_holiday after it’s been deleted? 17 www.umbc.edu

  18. Ideal Destructor Definition • Clears all information and sets pointers to NULL Date::~Date() { // clear member variable info m_day = m_month = m_year = 0; *m_next_holiday = ""; // free and set pointers to NULL delete m_next_holiday; Why aren’t we m_next_holiday = NULL; using the mutator functions here? } 18 www.umbc.edu

  19. Freeing Memory • Done using the delete() function – Takes a pointer as an argument: delete(grades); delete(letters); • delete() does not work recursively – For each individual allocation, there must be an individual call to free that allocated memory – Called in a sensible order 19 www.umbc.edu

  20. Freeing in Order In what order would you free the nodes of this linked list? A B C D E 20 www.umbc.edu

  21. Freeing in Order In what order would you free the nodes of this binary tree? A B C D E F G H 21 www.umbc.edu

  22. Copy Constructors and Assignment Operators www.umbc.edu

  23. Copying Objects… • When does C++ make copies of objects? – Pass by value – Return by value – Assignment – a nd… – New object initialized from existing object www.umbc.edu

  24. 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 www.umbc.edu

  25. 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 } www.umbc.edu

  26. 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 Class ------------- ------------- int *data1 abc int *data1 string *data2 string *data2 Foo Object *data3 Object *data3 bar www.umbc.edu

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

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

  29. 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 } www.umbc.edu

  30. What’s Wrong With This? Shoe& Shoe::operator=( Shoe a 7 ------------- const Shoe& shoe ) int *m_size { abc string *m_brand m_size = new int(*shoe.m_size); m_brand = Shoe b 4 new string(*shoe.m_brand); ------------- } int *m_size edf string *m_brand // In main() Shoe a(7, "abc"); Shoe b(4, "edf"); What happened to the memory b was pointing b = a; to first??? www.umbc.edu

  31. 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"); How does the c = b Shoe b(4, "edf"); work, when b = a Shoe c(9, "ghi"); returns nothing?? c = b = a; www.umbc.edu

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

  33. Self-Assignment class RentalSystem { public: // Assume constructor, other methods… RentalSystem& operator=( const RentalSystem & rs ) private: What happens when you do Customer *m_customers; the following? int m_nbrOfCustomers; }; RentalSystem r; // Add customers… RentalSystem& RentalSystem::operator=( r = r; 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; } www.umbc.edu

  34. 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; } www.umbc.edu

  35. Announcements • Project 3 is out – get started now! – Due Thursday, March 31st • Exam 2 is in 2 weeks – Will focus heavily on: • Classes • Inheritance • Linked Lists • Dynamic Memory 35 www.umbc.edu

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