Home Giáo Trình OOP Chương 5 - HÀM XÂY DỰNG, HÀM HỦY VÀ VIỆC KHỞI TẠO ĐỐI TƯỢNG - Giáo trình lập trình hướng đối tượng (OOP) - Đại học Tây Đô March 07, 2023 >Bấm vào ĐÂY để Download Key: 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 xây dựng sao chép • Thuộc tính của 1 lớp là đối tượng 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. Diem(int h, int t) { x = h; y=t; } class PhanSo { int tu, mau; public: PhanSo() { tu=0; mau=1; } PhanSo(int x) PhanSo(int t, int m) { tu=x; mau=1; } { tu = t; mau=m; } .... }; Hàm xây dựng Cấp vùng nhớ cho con trỏ strcpy(mssv,””); class Stack { float *ds; int soluong; int vitri; public: Stack(int max = 10) { soluong = max; hoten = new char[50]; vitri = 0; ds = new SinhVien(char*,char*,int,fl float[soluong]; } Stack(float* d, int m, int n); ... }; Hàm xây dựng • 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ố. void GanGiaTri(int, void main() { Diem a; Diem *pa = new Diem(); Diem ds1[10]; Diem *ds2 = new Diem[20]; ... } 1000H x ... y ... a Không có giá trị nên dễ gây ra hiệu ứng phụ đầu Hàm xây dựng • 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. PhanSo *pa = new PhanSo; PhanSo *pa1 = new PhanSo(); PhanSo *pa2 = new PhanSo[5]; PhanSo *pb = new PhanSo(3); void main() { Stack a; Stack b(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); ... } Hàm xây dựng – Đố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 tu mau c 2 5 c 1000H tu mau 1000H 1000 tu 1000 *pa2 mau 0 0 1 1 1200H *ds soluong ... ... ... vitri *ds soluong vitri 1200 5 0 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 Stack { float *ds; int soluong; int vitri; public: Stack(int max = 10) { soluong = max; hoten = new char[50]; vitri = 0; ds = new delete[] hoten; } 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. Stack *pa = new Stack(8); Stack *pb = new Stack[5]; pb = new Stack(20); Hàm xây dựng được gọi Hàm hủy được gọi cho đố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 xây dựng được gọi 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 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ỏ. Hàm xây dựng sao chép 1300 8 3 a soluong 1300H 4 3.2 1.4 ... *ds vitri 1300 8 3 b 2 con trỏ sẽ trỏ cùng 1 địa chỉ nếu không định nghĩa hàm xây dựng sao chép 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) { ... } – 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 VD: Diem(const Diem& d) { x=d.x; y=d.y; } PhanSo(const PhanSo& p) { tu=p.tu; mau=p.mau; } 12 Hàm xây dựng sao chép SinhVien nva; ... 1 9 2 0 8 9 1 \0 mssv[] 1240 1974 8.14 *hoten namsinh diemtb 1240H N g u y e n ... ... SinhVien(const SinhVien& s){ strcpy(mssv, s.mssv); hoten = new char[50]; strcpy(hoten, s.hoten); namsinh = s.namsinh; 2760H copy N g u y e n ... ... 1 9 2 0 8 9 1 \0 2760 1974 8.14 mssv[] *hoten namsinh diemtb SinhVien x(nva); Hàm xây dựng sao chép Stack a(8); ... *ds soluong vitri 1300 8 3 a 1300H 4 3.2 1.4 ... ... Stack(const Stack& s) { soluong = s.soluong; ds = new float[soluong]; for(int i=0; i>bankinh; } void DuongTron:: DoiDTron(int dx,int dy) { tam.DoiDiem(dx, dy); }
Post a Comment