Classes Copy Constructors Department of Computer and Information Science, School of Science, IUPUI CSCI 240 Classes Copy Constructors Dale Roberts, Lecturer Computer Science, IUPUI E-mail: droberts@cs.iupui.edu
Copy Constructor Constructor with a Reference to THAT CLASS as an ARGUMENT X(X &) Format Initialization of a New Object by Another Object of that Class An Object is Passed by Value to a Function An Object is Returned from a Function Shallow and Deep Copying -- Involvement of Pointers Implicit Copy Constructor is Created by the Compiler to Perform Member-wise Initialization
Copy Constructor – Example 1 // date.h #define size 50 class date{ private: int day, month, year; char *string_date; public: date(char *ip_date); //Constructor date(const date &ip_date); // Copy Constructor ~date(); //Destructor void print_date(); //Member Function };
Copy Constructor – Example 1 …. // date.cpp #include “date.h” Date::date() //default constructor {day = 0; month = 0; year = 0; string_date = 0;} date::date(char *ip_date){ //Constructor day = 0; month = 0; year = 0; string_date = new char [size]; strcpy(string_date, ip_date); } //Shallow Copy Constructor date(const date &ip_date) {string_date = ip_date.string_date;} //Destructor date::~date() {delete[] (string_date);}
Copy Constructor – Example 1 …. // client.cpp #include “date.h” main() { date today("June 21, 1995"); //Use of shallow copy constructor date extra_day = today; } “Shallow copy” simply means that all the data member values are copied.
Copy Constructor – Example 2 // date.h #define size 50 class date{ private: int day, month, year; char *string_date; public: date(char *ip_date); //Constructor date(const date &ip_date); // Copy Constructor ~date(); //Destructor void print_date(); //Member Function };
Copy Constructor – Example 2 …. // date.cpp #include “date.h” Date::date() //default constructor {day = 0; month = 0; year = 0; string_date = 0;} date::date(char *ip_date){ //Constructor day = 0; month = 0; year = 0; string_date = new char [size]; strcpy(string_date, ip_date); } //Deep Copy Constructor date(const date &ip_date) { string_date = new char[size]; strcpy(string_date, ip_date.string_date); } //Destructor date::~date() {delete[] (string_date);}
Copy Constructor – Example 2 …. // client.cpp #include “date.h” main() { date today("June 21, 1995"); //Deep copy constructor date extra_day = today; } “Deep copy” means that objects pointed to by data members are also copied. Deep copying may be required whenever you have data members that are pointers.
Copy Constructor - Example 3 // student.h /* A Simple Class to Represent a Student */ #define size 50 class Student{ private: char *name; char *id; char *email; public: Student(char *, char *, char *); Student(Student &); //Copy constructor ~Student(); };
Copy Constructor – Example 3 …. // student.cpp #include “student.h” /* Member functions of the “Student" class */ Student ::Student(char *studentName, char *studentId, char *studentEmail){ name = new char[size]; strcpy(name, studentName); id = new char[size]; strcpy(id, studentId); email = new char[size]; strcpy(email, studentEmail);} Student::~Student(){ delete [] name; delete [] id; delete [] email;} //Shallow copy constructor Student::Student (Student &s){ name = s.name; id = s.id; email = s.email; }
Copy Constructor – Example 3 …. // client.cpp #include “student.h” /* “csStudent" is an instance of “Student" */ main(){ Student csStudent1("Susie Creamchese“, "123456789“, "screamch@iupui.edu"); Student csStudent2 = csStudent1; } What happens when csStudent2 changes its name?
Copy Constructor - Example 4 // student.h /* A Simple Class to Represent a Student */ #define size 50 class Student{ private: char *name; char *id; char *email; public: Student(char *, char *, char *); ~Student(); Student(Student &); //Copy constructor };
Copy Constructor – Example 4 …. // student.cpp #include “student.h” /* Member functions of the “Student" class */ Student::Student(char *studentName, char *studentId, char *studentEmail){ name = new char[size]; strcpy(name, studentName); id = new char[size]; strcpy(id, studentId); email = new char[size]; strcpy(email, studentEmail);} Student::~Student(){ delete [] name; delete [] id; delete [] email;} // Deep copy constructor Student::Student(Student &s){ name = new char[size]; strcpy(name, s.name); id = new char[size]; strcpy(id, s.id); email = new char[size]; strcpy(email, s.email);}
Copy Constructor – Example 4 …. // client.cpp #include “student.h” main(){ Student csStudent1 (“Susie Creamchese”, “123456789”, “screamch@iupui.edu”); Student csStudent2 = csStudent1; } What happens when csStudent2 changes its name?
Acknowledgements These slides were originally prepared by Rajeev Raje, modified by Dale Roberts.