Thông tin tài liệu
Chương HÀM XÂY DỰNG, HÀM HỦY VÀ VIỆC KHỞI TẠO ĐỐI TƯỢNG Nội dung • Hàm xây dựng • Hàm hủy • Hàm xây dựng chép • Thuộc tính lớp đố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 thuộc tính – Cấp vùng nhớ cho trỏ thành viên class Diem { int x, y; public: Diem(int a) { x = y = a; } Diem(int h, int t) { x = h; y=t; } … }; class PhanSo { int tu, mau; public: PhanSo() { tu=0; mau=1; } PhanSo(int x) { tu=x; mau=1; } PhanSo(int t, int m) { tu = t; mau=m; } … }; Hàm xây dựng • Ví dụ: class SinhVien { class Stack { char mssv[8]; float *ds; char* hoten; int soluong; int namsinh; int vitri; float diemtb; public: Cấp vùng public: Stack(int max = 10) nhớ SinhVien() { { cho trỏ strcpy(mssv,””); soluong = max; hoten = new char[50]; vitri = 0; ds = new namsinh = 1980; diemtb = 0; float[soluong]; } } SinhVien(char*,char*,int,fl Stack(float* d, int m, int n); oat); … … }; }; Hàm xây dựng • Nếu khơng có định nghĩa hàm xây dựng: – Mặc nhiên tự động có hàm xây dựng khơng tham số – Chỉ có cách khởi tạo đối tượng theo dạng không tham số class Diem { int x, y; public: void InDiem(); void NhapDiem(); void GanGiaTri(int, int); int GiaTriX(); int GiaTriY(); … }; // Định nghĩa hàm thành viên void main() { Diem a; Diem *pa = new Diem(); Diem ds1[10]; Diem *ds2 = new Diem[20]; … } x y … … a 1000H Khơng có giá trị đầu nên dễ gây hiệu ứng phụ Hàm xây dựng • Nếu có định nghĩa hàm xây dựng: – Có hàm xây dựng có nhiêu cách khởi tạo đối tượng theo dạng định nghĩa 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(); Stack *pb = new Stack(40); PhanSo *pa = new PhanSo; PhanSo *pa1 = new PhanSo(); Stack *pc = new Stack[40]; PhanSo *pa2 = new PhanSo[5]; float data[40]; for(int i=0;i delete trỏ class SinhVien { char mssv[8]; char* hoten; int namsinh; float diemtb; public: SinhVien() { strcpy(mssv,””); hoten = new char[50]; namsinh = 1980; diemtb = 0; } ~SinhVien() { delete[] hoten; } … }; class Stack { float *ds; int soluong; int vitri; public: Stack(int max = 10) { soluong = max; vitri = 0; ds = new float[soluong]; } ~Stack() { delete[] ds; } … }; Hàm hủy • Thứ tự thực hiện: gọi trước hủy đối tượng: – Kết thúc hàm mà ta có khởi tạo đối tượng – Thu hồi vùng nhớ cho trỏ đối tượng Hàm xây dựng gọi void HamMinhHoa() { Stack a; Stack *pa = new Stack(8); … delete pa; Stack *pb = new Stack[5]; … delete[] pb; pb = new Stack(20); … } Hàm hủy gọi cho đối tượng mà pa trỏ tới Hàm xây dựng gọi lần Hàm hủy gọi lần Hàm xây dựng gọi Hàm hủy gọi cho a trước kết thúc hàm HamMinhHoa() Hàm xây dựng chép • Tại cần hàm xây dựng chép? – Khởi tạo đối tượng có giá trị giống đố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 chép: – Ngôn ngữ tự động tạo cho ta: nội dung gán (=) tương ứng thành phần – Khơng xác có liệu thành viên trỏ 10 Hàm xây dựng chép Stack a(8); … 130 *ds soluong vitri a Stack b(a); 1300H 130 *ds soluong vitri b 3.2 1.4 … trỏ trỏ địa không định nghĩa hàm xây dựng chép Hàm xây dựng chép • Cú pháp: (const & ) { 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 thành phần liệu (không trỏ) – Cấp vùng nhớ 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 chép • 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; … \ mssv[] *hoten namsinh diemtb 9 1240 1974 8.14 24 N g u 70 6H N0 g u y H y e e n \ 9 2760 1974 8.14 SinhVien x(nva); n … … … c… o p y mssv[] *hoten namsinh diemtb 13 Hàm xây dựng chép • Ví dụ: class Stack { Stack a(8);3… float *ds; *ds 130 int soluong; soluong 04 … … int vitri; H vitri public: a … copy Stack(const Stack& s) { soluong = s.soluong; *ds 157 vitri = s.vitri; soluong 54 … … ds = new float[soluong]; vitri for(int i=0; i
Ngày đăng: 28/12/2021, 19:14
Xem thêm: Bài giảng 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