Quá tải các Constructors

Một phần của tài liệu Cấu trúc của một chương trình C++ (Trang 68 - 69)

Bài 4.1 Các lớp

Quá tải các Constructors

khác số tham số. Nhớ rằng ở một thời điểm trình dịch chỉ thực hiện một hàm phù hợp (xem phần 2.3, Hàm-II). Do vậy chỉ một hàm constructor phù hợp được gọi vào thời điểm một đối tượng lớp được khai báo.

Trong thực tế, khi khai báo một lớp mà chúng ta không chỉ định một hàm constructor nào thì trình dịch sẽ tự động tạo ra hai constructor quá tải ("constructor mặc định" và "copy constructor"). Ví dụ, đối với lớp:

class CExample { public:

int a,b,c;

void multiply (int n, int m) { a=n; b=m; c=a*b; }; };

trình dịch sẽ tự động cho rằng lớp có hai constructor sau:

Constructor rỗng

Đây là một constructor không có tham số. Nó chẳng làm gì cả. CExample::CExample () { };

Copy constructor

Đây là một constructor có một tham số cùng kiểu với lớp. Nó thực hiện một việc là gán tất cả các biến thành viên không tĩnh (nonstatic) của lớp giá trị của biến tương ứng của đối tượng tham số.

• CExample::CExample (const CExample& rv) {

• a=rv.a; b=rv.b; c=rv.c;

}

Cần phải nhấn mạnh rằng các constructor mặc định này chỉ tồn tại nếu không có constructor được khai báo. Tất nhiên là bạn có thể quá tải constructor của nó để cung cấp các constructor khác nhau cho các mục đích khác nhau:

// overloading class constructors

#include <iostream.h> class CRectangle { int width, height; public:

CRectangle ();

CRectangle (int,int);

int area (void) {return (width*height);} }; CRectangle::CRectangle () { width = 5; height = 5; }

CRectangle::CRectangle (int a, int b) {

rect area: 12

width = a; height = b; } int main () { CRectangle rect (3,4); CRectangle rectb;

cout << "rect area: " << rect.area() << endl;

cout << "rectb area: " << rectb.area() << endl;

}

Trong trường hợp này rectb được khai báo không dùng tham số, vì vậy nó được khởi tạo với constructor không có tham số, constructor này đặt widthheight bằng 5.

Chú ý rằng nếu chúng ta khai báo một đối tượng mới và không muốn truyền tham số cho nó thì không cần phải cặp ngoặc đơn ():

CRectangle rectb; // đúng

CRectangle rectb(); // sai!

Con trỏ tới lớp

Một phần của tài liệu Cấu trúc của một chương trình C++ (Trang 68 - 69)

Tải bản đầy đủ (DOC)

(104 trang)
w