1. Trang chủ
  2. » Công Nghệ Thông Tin

Hàm xây dựng và hàm hủy OOP C

17 392 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 787,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Nội dung  Hàm xây dựng Constructor  Hàm hủy Destructor  Hàm xây dựng sao chép Copy constructor  Đối tượng là dữ liệu thành viên của một lớp... Khởi tạo đối tượng  Hàm xây dựng và vi

Trang 1

TS Trần Công Án - 2014

Hàm xây dựng, hàm hủy

CT114 – Lập trình Hướng đối tượng C++

Trang 2

Nội dung

 Hàm xây dựng (Constructor)

 Hàm hủy (Destructor)

 Hàm xây dựng sao chép (Copy constructor)

 Đối tượng là dữ liệu thành viên của một lớp.

Trang 3

Hàm xây dựng

 Mục đích: dùng để khởi tạo cho đối tượng.

 Gán giá trị cho các dữ liệu thành viên.

 Cấp phát vùng nhớ cho các con trỏ.

 Hàm xây dựng

class PhanSo {

int tu, mau;

public :

PhanSo()

{ tu=0 ; mau=1 ; }

PhanSo( int t, int m)

{ tu=t; mau=m; }

};

class Stack {

float *ds;

int soluong, vitri;

public :

Stack( int n=10 ) {

ds = new float [n];

soluong = n;

vitri = 0 ;

}

};

Trang 4

Khởi tạo đối tượng

 Hàm xây dựng và việc khởi tạo đối tượng:

 Lớp có bao nhiêu hàm xây dựng ⇒ có bấy nhiêu cách tạo đối tượng , trừ trường hợp dùng đối số mặc nhiên.

 Nếu lớp không có hàm xây dựng nào, trình biên dịch

sẽ tự động thêm vào 1 hàm xây dựng không đối số

được gọi là hàm xây dựng mặc nhiên

Ví dụ:

 Lớp Phanso trong ví dụ trước có 2 hàm xây dựng

⇒ có 2 cách tạo 1 đối tượng Phanso:

Phanso p1; Phanso p2(1, 2);

 Lớp Stack có 1 hàm XD, nhưng có 2 cách tạo ĐT

Stack: Stack s; Stack s(20);

 Hàm xây dựng

Trang 5

Trình tự tạo đối tượng

 Vùng nhớ dành cho đối tượng được cấp phát trước.

 Hàm xây dựng được gọi để khởi tạo giá trị cho các

dữ liệu thành viên của đối tượng mới.

 Hàm xây dựng

p1

tu:…

mau:…

tu:1 mau:2

ds:…

soluong:…

vitri:…

2 × 2 bytes

s

ds:1000

soluong:5 vitri:0

3 × 2 bytes

1000

5 × 2 bytes

Trang 6

Hàm hủy

Mục đích: Thu hồi các nguồn tài nguyên đang sử

dụng bởi đối tượng trước khi đối tượng bị hủy

 Thu hồi các vùng nhớ đã cấp phát cho các con trỏ;

 Đóng các nguồn tài nguyên đang mở (tập tin,…).

 Hàm hủy

class PhanSo {

int tu, mau;

public :

PhanSo()

{ tu=0 ; mau=1 ; }

PhanSo( int t, int m)

{ tu=t; mau=m; }

};

class Stack {

float *ds;

int soluong, vitri;

public :

Stack( int n=10 ) {

ds = new float [n];

soluong = n;

vitri = 0 ;

}

};

Trang 7

Hàm xây dựng sao chép

Mục đích: dùng để tạo 1 đối tượng từ 1 đối

tượng đã tồn tại Được gọi trong các trường hợp:

 Đối số của hàm là một đối tượng.

 Trị trả về của hàm là 1 đối tượng.

 Khởi tạo đối tượng từ một đối tượng đã có sẵn.

 Hàm xây dựng sao chép

class Diem {

int x,y;

public :

Diem( int h=0 , int t=0 ) {

x = h; y = t;

}

Diem doixung() {

return Diem(-x,-y);

}

char * trung( Diem d ) {

if (x==d.x && y==d.y) return “Trung”;

return “Ko trung”;

} };

Diem a(1 , 2 ), b, c(a) ;

b = a.doixung() ;

cout << a.trung(b) ;

Trang 8

Hàm xây dựng sao chép

 Trong cả 3 trường hợp trên, có 1 đối tượng mới

được tạo ra từ một đối tượng có sẵn :

 Diem c(a): tạo đối tượng c “giống” đối tượng a

 b = a.doixung(): một đối tượng “tạm” “giống” với

đối tượng Diem(-x,-y) trong hàm doixung()

được tạo ra bên trong hàm main() để gán cho b.

 a.trung(b): đối tượng d, là tham số hình thức của

hàm trung() được tạo ra “giống” với đối tượng b, là tham số thực tế trong hàm main().

 Khi đó, hàm xây dựng sao chép của các đối

tượng “mới” sẽ được gọi để sao chép dữ liệu.

 Hàm xây dựng sao chép

Trang 9

Hàm xây dựng sao chép

 Nếu lớp không có hàm xây dựng sao chép:

 Trình biên dịch sẽ tự động thêm vào cho lớp một hàm

xây dựng sao chép mặc nhiên

 Hàm này sẽ thực hiện gán tuần tự từng thuộc tính

của đối tượng mới bằng (“=“) với từng thuộc tính

tương ứng của đối tượng có sẵn.

 Có thể bị sai nếu lớp có dữ liệu thành viên là con trỏ.

 Hàm xây dựng sao chép

Chú ý: Phân biệt giữa trường hợp thực hiện phép gán (“=“)

với trường hợp gọi hàm xây dựng sao chép.

Diem a(1,2), b, c(a); //gọi hàm XDSC cho c

b = a; //thực hiện phép gán cho b

Trang 10

Ví dụ

 Hàm xây dựng sao chép

Stack a(5);

//gán dữ liệu cho Stack a

Stack b(a); //tạo b giống a

a

ds:1000

soluong:5 vitri:3

1

3 2

1000

5 × 2 bytes

b

ds:

soluong:

vitri:

Diem a(1,2);

Diem b(a); // tạo b giống a

a

x:1

y:2

b

x:

y:

=

=

=

=

=

1 2

1000 5 3

Trang 11

Hàm xây dựng sao chép

 Cú pháp khai báo:

<tên lớp> ( const <tên lớp>& <tên t.số>);

 Tên hàm trùng với tên lớp (giống hàm xây dựng).

 Có một đối số là một đối tượng thuộc chính lớp đó

(đối tượng mà ta cần sao chép dữ liệu).

 Nội dung hàm:

 Gán bằng (“=“) cho từng thuộc tính tương ứng.

 Đối với dữ liệu thành viên là con trỏ: cấp phát vùng

và sao chép nội dung vùng nhớ quản lý bởi con trỏ.

Trang 12

Ví dụ

 Hàm xây dựng sao chép

class Diem {

int x, y;

public :

Diem( int x= 0 , int y= 0 ) {

this ->x = x;

this ->y = y;

cout << “ \ nXD ” << this ;

}

Diem( const Diem& d) {

x = d.x; y = d.y;

cout << "\nXDSC: " << this ;

}

Diem doixung() {

Diem kq(-x,-y);

return kq;

}

};

Đây cũng chính là nội dung hàm XDSC mặc nhiên

void main() {

Diem a( 1 , 2 );

Diem b(a), c;

c = a.doixung();

cout << "\na: " << &a;

cout << "\nb: " << &b;

cout << "\nc: " << &c;

}

Trang 13

Ví dụ

 Hàm xây dựng sao chép

class Stack {

float * ds;

int sluong, vtri;

public :

Stack( int sl= 10 ) {

ds = new float [sl];

sluong = sl; vtri = 0 ;

}

Stack( const Stack& s) {

sluong = s.sluong;

vtri = s.vtri;

ds = new float [s.sluong];

for ( int i= 0 ; i<=vtri;i++)

ds[i] = s.ds[i];

}

~Stack() { delete [] ds; }

};

Hàm xây dựng sao chép mặc nhiên

Stack( const Stack& s) {

sluong = s.sluong;

vtri = s.vtri;

ds = s.ds;

}

a

ds:1000

soluong:5 vitri:2

1

3 2

b

ds:

soluong:

vitri:

=

2

=

=

=

1010

1 3 2

Trang 14

Đối tượng là dữ liệu thành viên

 Lớp là một kiểu dữ liệu do người dùng định nghĩa

⇒ Dữ liệu thành viên của một lớp có thể là 1 đối

tượng.

 Đây là một cách sử dụng lại mã (reusability), trong đó

quan hệ giữa lớp sử dụng lại lớp đã thiết kế và lớp

được sử dụng là quan hệ “có” hay “bao gồm”

(Cần phân biệt với tính kế thừa, quan hệ “là”).

 Đối tượng là dữ liệu thành viên của một lớp

Trang 15

Cách truy xuất

 Truy xuất các thành phần của ĐT thông qua tên đối

tượng

 Chú ý thuộc tính truy cập: Chỉ truy xuất được các

thành phần public

 Đối tượng là dữ liệu thành viên của một lớp

void Duongtron::hienthi() {

cout << "Tam: " ;

tam.hienthi();

cout << "\nBan kinh: " << bkinh;

}

void Duongtron::doiTam( int dx, int dy)

{

tam.doidiem(dx, dy);

}

void Duongtron::nhap() {

cout << "Nhap tam:" ;

tam.nhap();

cout << "Nhap bkinh:" ;

cin >> bkinh;

}

tam.x = xxx;  Lỗi tam.y = xxx;  Lỗi

Trang 16

Hàm xây dựng

 Hàm xây dựng của ĐT là dữ liệu thành viên:

 Trong định nghĩa hàm xây dựng của lớp sử dụng đối

tượng là dữ liệu thành viên, ta gọi hàm xây dựng cho

các đối tượng này bằng cú pháp:

<prototype hàm XD> : <tên ĐT>(tsố) {…}

 Ví dụ:

Duongtron() : tam() { bkinh = 0 ; }

Duongtron(Diem t, int r) : tam(t) , bkinh(r) {}

 Đối tượng là dữ liệu thành viên của một lớp

Trang 17

TS Trần Công Án - 2014

CT114 – Lập trình Hướng đối tượng C++

Ngày đăng: 21/10/2014, 21:21

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w