
Lecture 6 • Copy constructor • Pointer this • Assignment operator • Recursive data structures – Example: single linked list • Friend functions Lec 5 Programming in C++ 1 A constructor for Employee • Constructor below may lead to problems Employee::Employee( const char *first, const char *last) { firstname = first; lastname = last; } – A better constructor should be such that each object has its own copy of the strings firstname and lastname Lec 5 Programming in C++ 2 1 Another Constructor for Employee See Fig07_17_19 • A better constructor in Code of Lec 5 Employee::Employee( const char *first, const char *last ) { firstName = new char[ strlen( first ) + 1 ]; strcpy( firstName, first ); lastName = new char[ strlen( last ) + 1 ]; strcpy( lastName, last ); } •Don’t forget: #include <cstring> Lec 5 Programming in C++ 3 Destructor for Employee • Do we need to program it? Why? – YES! To avoid memory leaks. Employee::~Employee() { delete [] firstName; // deallocate memmory delete [] lastName; // deallocate memory } Lec 5 Programming in C++ 4 2 More on constructors … • Consider the following declaration Employee E1(“Anna”, “Pettersson”); – Assume we would like to create another employee with same data as E1 Employee E2(E1); – We need another constructor to create a copy of E1 → Copy Constructor Lec 5 Programming in C++ 5 A copy constructor for Employee class Employee::Employee(const Employee &E) { firstName = new char[strlen(E.firstName) + 1]; strcpy(firstName, E.firstName); lastName = new char[strlen(E.lastName) + 1]; strcpy(lastName, E.lastName); } Lec 5 Programming in C++ 6 3 Copy Constructor Copy constructor is automatically called when needed to make a copy of an object 1. Objects passed-by-value as function arguments 2. Objects returned from functions Why is the argument of the copy constructor passed-by-reference? Employee::Employee(const Employee E) { … } Passing-by-value does not work!! Lec 5 Programming in C++ 7 Moving on to this • Recall class Time and assume the following functions are added void Time::setHour( int h ) { hour = ( h >= 0 && h < 24 ) ? h : 0; } void Time::setMinute( int m ) { minute = ( m >= 0 && m < 60 ) ? m : 0;} void Time::setSecond( int s ) { second = ( s >= 0 && s < 60 ) ? s : 0; } Lec 5 Programming in C++ 8 4 Cascading Function Calls •Examples: The result of an assignment L = R; int x, y, w; is the R-value x = y = w = 9; cout << x << ““<< y << endl; • We would like to write: returns Time T(5, 30, 22); void Time *ptr = &T; T.setMinute(18).setSecond(30); Not possible!!! ptr->setHour(18)->setMinute(15); Lec 5 Programming in C++ 9 The this Pointer • Allows object to access own address (refer to itself) Time T(5, 30, 22); In function setMinute T.setMinute(18); this points to object T Time& Time::setHour( int h ){ hour = ( h >= 0 && h < 24 ) ? h : 0; Why not ? return *this; Time Why to return Time&? } Lec 5 Programming in C++ 10 5 Assignment Operator • Why to re-program it? – There is an assignment ( = ) operator by default – It should be possible to cascade Employee E1(“Anna”, “Pettersson”); Employee E2, E3(“Maria”, “Ciao”); E2 = E3 = E1; – What should it do? 1. Deallocate the memory used by E2 2. Allocate new memory 3. Copy data from E1 to E2 Lec 5 Programming in C++ 11 Assignment Operator Employee& Employee::operator=( const Employee& E) { //Deallocate the memory delete [] firstName; delete [] lastName; //Allocate new memory and perform the copy firstName = new char[strlen( E.firstName ) + 1]; strcpy( firstName, E.firstName ); lastName = new char[strlen( E.lastName ) + 1]; strcpy( lastName, E.lastName ); return *this; } See copy constructor Lec 5 Programming in C++ 12 6 Self-assignment •What if Employee E1(“Anna”,“Pettersson”); E1 = E1; • Does the code in the slide before work? – NO!! Why? •First, test for self-assignment Lec 5 Programming in C++ 13 Assignment Operator Employee& Employee::operator=( const Employee& E) { if (&E != this){// test for self-assignment //Deallocate the memory delete [] firstName; delete [] lastName; //Allocate new memory and perform the copy firstName = new char[strlen( E.firstName ) + 1]; strcpy( firstName, E.firstName ); lastName = new char[strlen( E.lastName ) + 1]; strcpy( lastName, E.lastName ); } return *this; } Lec 5 Programming in C++ 14 7 Copy constructor and Assignment operator •A copy constructor, destructor, and assignment operator are usually provided for classes that allocate memory dynamically. •Differences between copy constructor and assignment operator? • Homework: – How to prevent an Employee object to be assigned to another Employee (e.g. E1 = E2; )? Lec 5 Programming in C++ 15 Recursive Data Structures • List of integers 41012 header Empty List Node 10 next header = new Node(0, NULL); value header Lec 5 Programming in C++ 16 8 Node.h class Node { public: // Constructor Node (int val, Node* n = NULL); private: int value; Node* next; friend class List; }; Lec 5 Programming in C++ 17 List.h class List { public: List (); List (int a[], int n); List (const List& b); //copy constructor ~List (); //destructor bool empty() const; int cardinality() const; bool member(int x) const; void insert(int x); void remove(int x); ... private: Node *header; friend std::ostream& operator<< (std::ostream& os, const List& b); }; Lec 5 Programming in C++ 18 9 Insert a Value in a Sorted List temp 41012 header 6 ptr 1. ptr = new Node(6); 2. ptr→next = temp→next; 3. temp→next = ptr; Lec 5 Programming in C++ 19 Insert a Value in a Sorted List Tests the end of the list void List::insert (int value) { Node *temp = header; while (temp -> next != 0 && temp -> next -> value < value) temp = temp -> next; if (temp -> next == 0 || temp -> next -> value != value) temp -> next = new Node(value, temp -> next); } Avoids dereferencing a pointer to NULL (0) In C++, boolean operations (e.g. &&) use short-circuit evaluation Lec 5 Programming in C++ 20 10.
Details
-
File Typepdf
-
Upload Time-
-
Content LanguagesEnglish
-
Upload UserAnonymous/Not logged-in
-
File Pages10 Page
-
File Size-