HÀM XÂY DỰNG, HÀM HỦY VÀ ViỆC KHỞI TẠO ĐỐI TƯỢNG

16 639 2
HÀM XÂY DỰNG, HÀM HỦY VÀ ViỆC KHỞI TẠO ĐỐI TƯỢNG

Đ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

Nguyễn Công Huy – Khoa CNTT&TT 1 HÀM XÂY DỰNG, HÀM HỦY VÀ HÀM XÂY DỰNG, HÀM HỦY VÀ ViỆC KHỞI TẠO ĐỐI TƯỢNG 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 Nguyễn Công Huy – Khoa CNTT&TT 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  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; 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; } …. }; Nguyễn Công Huy – Khoa CNTT&TT 3 Hàm xây dựng Hàm xây dựng  Ví dụ: class SinhVien { char mssv[8]; char* hoten; int namsinh; float diemtb; public: SinhVien() { strcpy(mssv,””); hoten = new char[50]; namsinh = 1980; diemtb = 0; } SinhVien(char*,char*,int,float); … }; class Stack { float *ds; int soluong; int vitri; public: Stack(int max = 10) { soluong = max; vitri = 0; ds = new float[soluong]; } Stack(float* d, int m, int n); … }; Cấp vùng nhớ cho con trỏ Nguyễn Công Huy – Khoa CNTT&TT 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ố. 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 … … … a x y 1000H void main() { Diem a; Diem *pa = new Diem(); Diem ds1[10]; Diem *ds2 = new Diem[20]; … } Không có giá trị đầu nên dễ gây ra hiệu ứng phụ Nguyễn Công Huy – Khoa CNTT&TT 5 Hàm xây dựng 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. void main() { PhanSo a; PhanSo b(3); 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); … } 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); … } Nguyễn Công Huy – Khoa CNTT&TT 6 Hàm xây dựng Hàm xây dựng  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. c tu mau 2 2 5 5 c tu mau PhanSo c(2,5); 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 … … … Nguyễn Công Huy – Khoa CNTT&TT 7 Hàm hủy 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: 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; } … }; Nguyễn Công Huy – Khoa CNTT&TT 8 Hàm hủy Hàm hủy  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; 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 pa đang trỏ tới Hàm xây dựng được gọi 5 lần 5 lần Hàm hủy được gọi 5 lần 5 lần Hàm hủy được gọi cho a a trước khi kết thúc hàm HamMinhHoa() Hàm xây dựng được gọi Nguyễn Công Huy – Khoa CNTT&TT 9 Hàm xây dựng sao chép 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ỏ. *ds soluong vitri 1300 8 3 4 3.2 1.4 … … … … … 1300H Stack a(8); … a Stack b(a); *ds soluong 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 Nguyễn Công Huy – Khoa CNTT&TT 10 Hàm xây dựng sao chép Hàm xây dựng sao chép  Cú pháp: <Tên lớp> ( const const <Tên lớ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; } [...]... 1570H b Stack b(a); 12 Hàm xây dựng sao chép  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; public: A() { x=0; } A (const A& a) { x=a.x; } void Hien() { cout . CNTT&TT 1 HÀM XÂY DỰNG, HÀM HỦY VÀ HÀM XÂY DỰNG, HÀM HỦY VÀ ViỆC KHỞI TẠO ĐỐI TƯỢNG 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 Nguyễn. là đối tượng Thuộc tính của 1 lớp là đối tượng  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 đó.  Nếu có nhiều thuộc tính là đối tượng, khởi tạo. CNTT&TT 13 Hàm xây dựng sao chép Hàm xây dựng sao chép  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

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

Mục lục

  • 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 sao chép

  • Thuộc tính của 1 lớp là đối tượng

Tài liệu cùng người dùng

Tài liệu liên quan