Xem mẫu

Nội dung 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 • Hàm xây dựng sao chép • Thuộc tính của 1 lớp là ñối tượng 1 2 Hàm xây dựng Hàm xây dựng • Mục ñích: khởi tạo giá trị ban ñầu cho ñối tượng • Ví dụ: – 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 { class PhanSo { int x, y; int tu, mau; public: public: Diem(int a) PhanSo() { x = y = a; } { tu=0; mau=1; } Diem(int h, int t) PhanSo(int x) { x = h; y=t; } { tu=x; mau=1; } …. PhanSo(int t, int m) }; { tu = t; mau=m; } …. }; 3 class SinhVien { class Stack { char mssv[8]; float *ds; char* hoten; int soluong; int namsinh; int vitri; float diemtb; public: public: Cấp vùng nhớ Stack(int max = 10) SinhVien() { cho con trỏ { strcpy(mssv,””); soluong = max; hoten = new char[50]; vitri = 0; namsinh = 1980; ds = new diemtb = 0; float[soluong]; } } SinhVien(char*,char*,int,fl Stack(float* d, int m, oat); int n); … … }; }; 4 Hàm xây dựng 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ố. • 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. class Diem { int x, y; public: void InDiem(); void NhapDiem(); void GanGiaTri(int, int); int GiaTriX(); int GiaTriY(); … }; // ðịnh nghĩa các hàm thành viên ... void main() { Diem a; Diem *pa = new Diem(); Diem ds1[10]; Diem *ds2 = new Diem[20]; … } x … 1000H Không có giá trị y ñầu a nên dễ gây ra hiệu ứng phụ void main() { void main() { PhanSo a; Stack a; PhanSo b(3); Stack b(5); PhanSo c(2,5); Stack c[5]; PhanSo d[3]; Stack *pa = new Stack(); PhanSo *pa = new PhanSo; Stack *pb = new Stack(40); PhanSo *pa1 = new PhanSo(); Stack *pc = new Stack[40]; PhanSo *pa2 = new PhanSo[5]; float data[40]; PhanSo *pb = new PhanSo(3); for(int i=0;i<10;i++) PhanSo *pc = new data[i]=i; PhanSo(2,5); Stack d(data, 30, 10); … … } } 6 Hàm xây dựng • Trình tự thực hiện: 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ỏ. – ðối tượng ñược tạo ra trước. – Hàm xây dựng sẽ gọi sau trên ñối tượng. class SinhVien { char mssv[8]; class Stack { float *ds; char* hoten; int soluong; PhanSo c(2,5); tu mau c PhanSo 1000H *pa2 = new tu PhanSo[5]; *pa2 tu 2 mau 5 c 1000H 0 0 0 0 0 mau 1 1 1 1 1 *pa2 int namsinh; float diemtb; public: SinhVien() { strcpy(mssv,””); hoten = new char[50]; namsinh = 1980; int vitri; public: Stack(int max = 10) { soluong = max; vitri = 0; ds = new float[soluong]; *ds Stack soluong b(5); vitri … … … 1200H *ds 1200 soluong vitri 7 diemtb = 0; } ~SinhVien() { delete[] hoten; … }; } ~Stack() { } delete[] ds; } … }; 8 Hàm hủy Hàm xây dựng sao chép • 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. • 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 =) void HamMinhHoa() { Stack a; Stack *pa = new Stack(8); … delete pa; Stack *pb = new Stack[5]; … delete[] pb; 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() 9 • 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 Hàm xây dựng sao chép • Cú pháp: (const & ) Stack a(8); soluong 1300 1340H 3.2 1.4 … vitri a *ds 1300 2 con trỏ sẽ trỏ Stack b(a); soluong cùng 1 ñịa chỉ vitri b ñịnh nghĩa hàm xây dựng sao chép { Nội dung hàm } VD:Diem(const Diem& d) { … } Stack(const Stack& s) { … } SinhVien(const SinhVien& sv) { … } • 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 Hàm xây dựng sao chép Hàm xây dựng sao chép • Ví dụ: • Ví dụ: class SinhVien { char mssv[8]; char* hoten; int namsinh; float diemtb; public: … SinhVien(const SinhVien& s){ strcpy(mssv, s.mssv); hoten = new char[50]; strcpy(hoten, s.hoten); namsinh = s.namsinh; diemtb = s.diemtb; } … }; SinhVien nva; … 1 9 2 0 8 9 1 \0 mssv[] 1240 *hoten 1974 namsinh 8.14 diemtb 1240H N g u y e n … … 2760H copy N g u y e n … … 1 9 2 0 8 9 1 \0 mssv[] 2760 *hoten 1974 namsinh 8.14 diemtb SinhVien x(nva); 13 class Stack { float *ds; int soluong; int vitri; public: … Stack(const Stack& s) { soluong = s.soluong; vitri = s.vitri; ds = new float[soluong]; for(int i=0; i nguon tai.lieu . vn