21
Constructors & Destructors Review

Constructors & Destructors Review

  • Upload
    gudrun

  • View
    63

  • Download
    8

Embed Size (px)

DESCRIPTION

Constructors & Destructors Review. What is a constructor?. It is a member function which initializes a class. A constructor has: (i) the same name as the class itself (ii) no return type. class rectangle { private: float height; float width; int xpos; int ypos; - PowerPoint PPT Presentation

Citation preview

Page 1: Constructors & Destructors Review

Constructors & DestructorsReview

Page 2: Constructors & Destructors Review

What is a constructor?

• It is a member function which initializes a class.

• A constructor has:

(i) the same name as the class itself

(ii) no return type

Page 3: Constructors & Destructors Review

class rectangle { private: float height; float width; int xpos; int ypos; public: rectangle(float, float); // constructor void draw(); // draw member function void posn(int, int); // position member function void move(int, int); // move member function}; rectangle::rectangle(float h, float w){ height = h; width = w; xpos = 0; ypos = 0;}

Page 4: Constructors & Destructors Review

Comments on constructors

• A constructor is called automatically whenever a new instance of a class is created.

• You must supply the arguments to the constructor when a new instance is created.

• If you do not specify a constructor, the compiler generates a default constructor for you (expects no parameters and has an empty body).

Page 5: Constructors & Destructors Review

void main(){ rectangle rc(3.0, 2.0);  rc.posn(100, 100); rc.draw(); rc.move(50, 50); rc.draw();} 

• Warning: attempting to initialize a data member of a class explicitly in the class definition is a syntax error.

Comments on constructors (cont.)

Page 6: Constructors & Destructors Review

Overloading constructors

• You can have more than one constructor in a class, as long as each has a different list of arguments.

 class rectangle { private: float height; float width; int xpos; int ypos; public: rectangle(float, float); // constructor rectangle(); // another constructor void draw(); // draw member function void posn(int, int); // position member function void move(int, int); // move member function};

Page 7: Constructors & Destructors Review

Overloading constructors (cont.)

rectangle::rectangle(){ height = 10; width = 10; xpos = 0; ypos = 0;} void main(){ rectangle rc1(3.0, 2.0); rectangle rc2();  rc1.draw(); rc2.draw();}

Page 8: Constructors & Destructors Review

Composition: objects as members of classes

• A class may have objects of other classes as members. class properties { private: int color; int line; public: properties(int, int); // constructor}; properties::properties(int c, int l){ color = c; line = l;}

Page 9: Constructors & Destructors Review

class rectangle { private: float height; float width; int xpos; int ypos; properties pr; // another object public: rectangle(float, float, int, int ); // constructor void draw(); // draw member function void posn(int, int); // position member function void move(int, int); // move member function};

Composition: objects as members of classes (cont.)

Page 10: Constructors & Destructors Review

Composition: objects as members of classes (cont.)

rectangle::rectangle(float h, float w, int c, int l):pr(c, l){ height = h; width = w; xpos = 0; ypos = 0;};  void main(){ rectangle rc(3.0, 2.0, 1, 3);  C++ statements;}

Page 11: Constructors & Destructors Review

What is a destructor?

• It is a member function which deletes an object.

• A destructor function is called automatically when the object goes out of scope: (1) the function ends (2) the program ends (3) a block containing temporary variables ends (4) a delete operator is called 

• A destructor has: (i) the same name as the class but is preceded by a tilde (~) (ii) no arguments and return no values

Page 12: Constructors & Destructors Review

class string { private: char *s; int size; public: string(char *); // constructor ~string(); // destructor}; string::string(char *c){ size = strlen(c); s = new char[size+1]; strcpy(s,c);} string::~string(){ delete []s;}

Page 13: Constructors & Destructors Review

Comments on destructors

• If you do not specify a destructor, the compiler generates a default destructor for you.

• When a class contains a pointer to memory you allocate, it is your responsibility to release the memory before the class instance is destroyed.

Page 14: Constructors & Destructors Review

What is a copy constructor?

• It is a member function which initializes an object using another object of the same class.

• A copy constructor has the following general function prototype: 

class_name (const class_name&);

Page 15: Constructors & Destructors Review

class rectangle { private: float height; float width; int xpos; int ypos; public: rectangle(float, float); // constructor rectangle(const rectangle&); // copy constructor void draw(); // draw member function void posn(int, int); // position member function void move(int, int); // move member function};

Page 16: Constructors & Destructors Review

rectangle::rectangle(const rectangle& old_rc){ height = old_rc.height; width = old_rc.width; xpos = old_rc.xpos; ypos = old_rc.ypos;} void main(){ rectangle rc1(3.0, 2.0); // use constructor rectangle rc2(rc1); // use copy constructor rectangle rc3 = rc1; // alternative syntax for

// copy constructor C++ statements; }

Page 17: Constructors & Destructors Review

Defining copy constructors is very important

• In the absence of a copy constructor, the C++ compiler builds a default copy constructor for each class which is doing a memberwise copy between objects.

• Default copy constructors work fine unless the class contains pointer data members ... why???

Page 18: Constructors & Destructors Review

#include <iostream.h>#include <string.h> class string { private: char *s; int size; public: string(char *); // constructor ~string(); // destructor void print(); void copy(char *);}; void string::print(){ cout << s << endl;}

Page 19: Constructors & Destructors Review

void string::copy(char *c)

{

strcpy(s, c);

}

 

void main()

{

string str1("George");

string str2 = str1; // default copy constructor

 

str1.print(); // what is printed ?

str2.print();

 

str2.copy("Mary");

 

str1.print(); // what is printed now ?

str2.print();

}

Page 20: Constructors & Destructors Review

Defining a copy constructor for the above example:

class string {

private:

char *s;

int size;

public:

string(char *); // constructor

~string(); // destructor

string(const string&); // copy constructor

void print();

void copy(char *);

};

Page 21: Constructors & Destructors Review

string::string(const string& old_str){ size = old_str.size; s = new char[size+1]; strcpy(s,old_str.s);} 

void main(){ string str1("George"); string str2 = str1; 

str1.print(); // what is printed ? str2.print(); 

str2.copy("Mary"); 

str1.print(); // what is printed now ? str2.print(); } 

Note: same results can be obtained by overloading the assignment operator.