Lập trình hướng đối tượng & C++ - Chương 5: Hàm xây dựng, hàm hủy và việc khởi tạo đối tượng

Tài liệu Lập trình hướng đối tượng & C++ - Chương 5: Hàm xây dựng, hàm hủy và việc khởi tạo đối tượng: HÀM XÂY DỰNG, HÀM HỦY VÀ VIỆC KHỞI TẠO ðỐI TƯỢNG Chương 5 1 Nội dung • Hàm xây dựng • Hàm hủy • Hàm xây dựng sao chép • Thuộc tính của 1 lớp là đối tượng 2 Hàm xây dựng • Mục đích: khởi tạo giá trị ban đầu cho đối tượng – Gán giá trị đầu cho các thuộc tính. – Cấp vùng nhớ cho con trỏ thành viên. class Diem { int x, y; class PhanSo { int tu, mau; 3 public: Diem(int a) { x = y = a; } Diem(int h, int t) { x = h; y=t; } . }; public: PhanSo() { tu=0; mau=1; } PhanSo(int x) { tu=x; mau=1; } PhanSo(int t, int m) { tu = t; mau=m; } . }; • Ví dụ: class SinhVien { char mssv[8]; char* hoten; int namsinh; float diemtb; public: class Stack { float *ds; int soluong; int vitri; public: Stack(int max = 10) Hàm xây dựng Cấp vùng nhớ 4 SinhVien() { strcpy(mssv,””); hoten = new char[50]; namsinh = 1980; diemtb = 0; } SinhVien(char*,char*,int,fl oat); }; { soluong = max; vitri = 0; ds = new float[soluong]; } Stack(float* d, int m, in...

pdf5 trang | Chia sẻ: putihuynh11 | Lượt xem: 397 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Lập trình hướng đối tượng & C++ - Chương 5: Hàm xây dựng, hàm hủy và việc khởi tạo đối tượng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
HÀM XÂY DỰNG, HÀM HỦY VÀ VIỆC KHỞI TẠO ðỐI TƯỢNG Chương 5 1 Nội dung • Hàm xây dựng • Hàm hủy • Hàm xây dựng sao chép • Thuộc tính của 1 lớp là đối tượng 2 Hàm xây dựng • Mục đích: khởi tạo giá trị ban đầu cho đối tượng – Gán giá trị đầu cho các thuộc tính. – Cấp vùng nhớ cho con trỏ thành viên. class Diem { int x, y; class PhanSo { int tu, mau; 3 public: Diem(int a) { x = y = a; } Diem(int h, int t) { x = h; y=t; } . }; public: PhanSo() { tu=0; mau=1; } PhanSo(int x) { tu=x; mau=1; } PhanSo(int t, int m) { tu = t; mau=m; } . }; • Ví dụ: class SinhVien { char mssv[8]; char* hoten; int namsinh; float diemtb; public: class Stack { float *ds; int soluong; int vitri; public: Stack(int max = 10) Hàm xây dựng Cấp vùng nhớ 4 SinhVien() { strcpy(mssv,””); hoten = new char[50]; namsinh = 1980; diemtb = 0; } SinhVien(char*,char*,int,fl oat); }; { soluong = max; vitri = 0; ds = new float[soluong]; } Stack(float* d, int m, int n); }; cho con trỏ • Nếu khơng cĩ định nghĩa hàm xây dựng: – Mặc nhiên sẽ tự động cĩ 1 hàm xây dựng khơng tham số. – Chỉ cĩ 1 cách khởi tạo đối tượng theo dạng khơng tham số. class Diem { int x, y; public: void main() { Diem a; Diem *pa = new Diem(); Hàm xây dựng 5 void InDiem(); void NhapDiem(); void GanGiaTri(int, int); int GiaTriX(); int GiaTriY(); }; // ðịnh nghĩa các hàm thành viên ... a x y 1000H Diem ds1[10]; Diem *ds2 = new Diem[20]; } Khơng cĩ giá trị đầu nên dễ gây ra hiệu ứng phụ • Nếu cĩ định nghĩa ít nhất 1 hàm xây dựng: – Cĩ bao nhiêu hàm xây dựng sẽ cĩ bấy nhiêu cách khởi tạo đối tượng theo dạng đã định nghĩa. void main() { PhanSo a; PhanSo b(3); void main() { Stack a; Stack b(5); Hàm xây dựng 6 PhanSo c(2,5); PhanSo d[3]; PhanSo *pa = new PhanSo; PhanSo *pa1 = new PhanSo(); PhanSo *pa2 = new PhanSo[5]; PhanSo *pb = new PhanSo(3); PhanSo *pc = new PhanSo(2,5); } Stack c[5]; Stack *pa = new Stack(); Stack *pb = new Stack(40); Stack *pc = new Stack[40]; float data[40]; for(int i=0;i<10;i++) data[i]=i; Stack d(data, 30, 10); } • Trình tự thực hiện: – ðối tượng được tạo ra trước. – Hàm xây dựng sẽ gọi sau trên đối tượng. tu mau 2 5 tu mau PhanSo c(2,5); Hàm xây dựng 7 c c PhanSo *pa2 = new PhanSo[5]; tu mau 1000H *pa2 1000 tu mau 1000H *pa2 1000 0 1 0 1 0 1 0 1 0 1 0 1200 5 *ds soluong vitri 1200H Stack b(5); *ds soluong vitri Hàm hủy • Mục đích: thu hồi vùng nhớ đã cấp cho con trỏ là dữ liệu thành viên => delete con trỏ. class SinhVien { char mssv[8]; char* hoten; int namsinh; float diemtb; public: class Stack { float *ds; int soluong; int vitri; public: 8 SinhVien() { strcpy(mssv,””); hoten = new char[50]; namsinh = 1980; diemtb = 0; } ~SinhVien() { delete[] hoten; } }; Stack(int max = 10) { soluong = max; vitri = 0; ds = new float[soluong]; } ~Stack() { delete[] ds; } }; • Thứ tự thực hiện: gọi trước khi hủy đối tượng: – Kết thúc 1 hàm mà trong đĩ ta cĩ khởi tạo đối tượng. – Thu hồi vùng nhớ cho con trỏ đối tượng. void HamMinhHoa() { Stack a; Hàm xây dựng được gọi Hàm hủy được gọi cho Hàm hủy 9 Stack *pa = new Stack(8); delete pa; Stack *pb = new Stack[5]; delete[] pb; pb = new Stack(20); } đối tượng mà pa đang trỏ tới Hàm xây dựng được gọi 5 lần Hàm hủy được gọi 5 lần Hàm hủy được gọi cho a trước khi kết thúc hàm HamMinhHoa() Hàm xây dựng được gọi Hàm xây dựng sao chép • Tại sao cần hàm xây dựng sao chép? – Khởi tạo 1 đối tượng cĩ giá trị giống 1 đối tượng khác. – Khác với phép gán (dấu =) • Nếu khơng định nghĩa hàm xây dựng sao chép: – Ngơn ngữ sẽ tự động tạo ra cho ta: nội dung là gán (=) tương ứng từng thành phần. – Khơng chính xác khi cĩ dữ liệu thành viên là con trỏ. 10 Hàm xây dựng sao chép *ds soluong vitri 1300 8 3 4 3.2 1.4 1300H Stack a(8); a *ds 1300 8 2 con trỏ sẽ trỏ Stack b(a); soluong vitri 3 b cùng 1 địa chỉ nếu khơng định nghĩa hàm xây dựng sao chép • Cú pháp: (const & ) { Nội dung hàm } VD: Diem(const Diem& d) { } Stack(const Stack& s) { } SinhVien(const SinhVien& sv) { } Hàm xây dựng sao chép • Nội dung: – Gán tương ứng các thành phần dữ liệu (khơng là con trỏ). – Cấp vùng nhớ và sao chép nội dung vùng nhớ từ đối tượng cho trước. VD: Diem(const Diem& d) { x=d.x; y=d.y; } PhanSo(const PhanSo& p) { tu=p.tu; mau=p.mau; } 12 • Ví dụ: class SinhVien { char mssv[8]; char* hoten; int namsinh; float diemtb; public: *hoten namsinh diemtb 1240 1974 8.14 1240H SinhVien nva; 91 02 98 \01 mssv[] Hàm xây dựng sao chép 13 SinhVien(const SinhVien& s){ strcpy(mssv, s.mssv); hoten = new char[50]; strcpy(hoten, s.hoten); namsinh = s.namsinh; diemtb = s.diemtb; } }; N g u y e n 2760 1974 8.14 91 02 98 \01 N g u y e n 2760H copy SinhVien x(nva); *hoten namsinh diemtb mssv[] • Ví dụ: class Stack { float *ds; int soluong; int vitri; public: *ds soluong vitri 1300 8 3 4 3.2 1.4 1300H a Stack a(8); Hàm xây dựng sao chép 14 Stack(const Stack& s) { soluong = s.soluong; vitri = s.vitri; ds = new float[soluong]; for(int i=0; i<vitri; i++) ds[i]=s.ds[i]; } }; Stack b(a); 1570 8 3 4 3.2 1.4 1570H b copy *ds soluong vitri • Sử dụng trong các trường hợp: – ðối tượng được truyền theo giá trị của đối số 1 hàm. – Trị trả về của hàm là 1 đối tượng. – Tạo ra 1 đối tượng cĩ giá trị giống 1 đối tượng cho trước. class A { int x; A HamThu(A x) { Hàm xây dựng sao chép 15 public: A() { x=0; } A(const A& a) { x=a.x; } void Hien() { cout<<“x=“<<x; } }; A y(x); return y; } void main() { A a,b; b = HamThu(a); A c = b; A *d = new A(c); } Cĩ bao nhiêu hàm xây dựng sao chép được gọi? Thuộc tính của 1 lớp là đối tượng • Giới thiệu: – Thuộc tính của 1 lớp cĩ thể cĩ kiểu bất kỳ. – Thuộc tính của 1 lớp cĩ thể là đối tượng của 1 lớp khác. Sử dụng lại 1 lớp, nhưng khơng phải là thừa kế class Diem { class DuongTron { 16 int x, y; public : Diem(); Diem(int , int); void Nhap(); void Hien(); void DoiDiem(int,int); int GiaTriX(); int GiaTriY(); }; Diem tam; int bankinh; public: DuongTron(); ... void Ve(); void Nhap(); void DoiDTron(int,int); float ChuVi(); float DienTich(); }; • Cách truy xuất: – Khi truy xuất đến thuộc tính là đối tượng, phải thơng qua tên của thuộc tính. – Lưu ý đến thuộc tính truy cập (public, private, ) của thành phần dữ liệu và hàm thành viên của lớp tạo ra đối tượng đĩ để truy xuất hợp lý. Thuộc tính của 1 lớp là đối tượng Void DuongTron::Ve() { cout<<“Tam : “; tam.Hien(); cout<<endl; cout<<“Ban kinh : “ <<bankinh<<endl; } Void DuongTron::Nhap() { 7 10 20tam bankinh x y DuongTron a; Thuộc tính của 1 lớp là đối tượng 18 cout<<“Nhap tam : “ <<endl; tam.Nhap(); cout<<“Nhap ban kinh : “; cin>>bankinh; } void DuongTron:: DoiDTron(int dx,int dy) { tam.DoiDiem(dx, dy); } • Hàm xây dựng: – Phải khởi tạo cho thuộc tính là đối tượng theo dạng hàm xây dựng của lớp đĩ. DuongTron() : tam() { bankinh=0; } Thuộc tính của 1 lớp là đối tượng 19 DuongTron(Diem d, int bk) : tam(d) { bankinh=bk; } DuongTron(int x, int y, int bk) : tam(x,y) { bankinh=bk; } DuongTron(const DuongTron& d): tam(d.tam) {bankinh=d.bankinh;} • Hàm xây dựng:  Nếu cĩ nhiều thuộc tính là đối tượng, khởi tạo các đối tượng này liên tiếp nhau thơng qua dấu phẩy (,).  Cú pháp này cho phép áp dụng cả với thuộc tính thường. Thuộc tính của 1 lớp là đối tượng 20 Duongtron(): tam(), bankinh(0) {} Duongtron(Diem d, int bk) : tam(d), bankinh(bk) {}

Các file đính kèm theo tài liệu này:

  • pdfchapter5_2497_1993466.pdf
Tài liệu liên quan