Initialization & Cleanup

 Là hàm được gọi thực thi khi định nghĩa 1 biến, đối tượng mới.

 Được gọi bởi trình biên dịch, ngay sau khi biến, đối tượng được cấp phát vùng nhớ.

 Có tên trùng với tên class.

 Không trả về bất kỳ giá trị nào, kể cả void.

 Có thể nạp chồng nhiều hàm constructor cho 1 class.

 

 

ppt21 trang | Chuyên mục: Lập Trình Hướng Đối Tượng | Chia sẻ: dkS00TYs | Lượt xem: 2128 | Lượt tải: 0download
Tóm tắt nội dung Initialization & Cleanup, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
INITIALIZATION & CLEANUP IN C++ GV: ThS. Nguyễn Văn Toàn. SV: Nguyễn Mạnh Điền. MSSV: 06520078 Overview: Constructor Default constructor Destructor Stack with constructor and destructor Copy constructor Elimination of definition block For loops Aggregate initialization Storage allocation CONSTRUCTOR Là hàm được gọi thực thi khi định nghĩa 1 biến, đối tượng mới. Được gọi bởi trình biên dịch, ngay sau khi biến, đối tượng được cấp phát vùng nhớ. Có tên trùng với tên class. Không trả về bất kỳ giá trị nào, kể cả void. Có thể nạp chồng nhiều hàm constructor cho 1 class. CONSTRUCTOR – cont. Nếu class không định nghĩa tường minh 1 hàm constructor  trình biên dịch sẽ phát sinh 1 hàm default constructor cho class. Hàm constructor có thể kết hợp sử dụng với tham số mặc định. CONSTRUCTOR – cont. Example: class point { 	private: 	int x; 	int y; 	public:	 	point(int px=0,int py=0) //hàm khởi tạo nhận 2 tham số kiểu int. 	{ 	x=px; 	y=py; } }; Khai báo đối tượng point: point test(5,10); point* tmp=new point(4,5); point temp1; point temp2(3); point arr[4]; DEFAULT CONSTRUCTOR Trình biên dịch sẽ phát sinh cho class nếu class chưa định nghĩa bất kỳ hàm constructor nào. Hàm default constructor không nhận tham số đầu vào nhưng cũng không thực hiện bất kỳ câu lệnh nào trong thân hàm. DEFAULT CONSTRUCTOR - cont Example: class point { 	private: 	int x; 	int y; }; Khi biên dịch chương trình sẽ phát sinh hàm default constructor cho class: 	point() { } DESTRUCTOR Được trình biên dịch gọi thực thi trước khi hủy hoàn toàn 1 đối tượng. Hàm destructor không nhận bất kỳ tham số đầu vào và cũng không trả về giá trị, kể cả void. Hàm hủy destructor là hàm duy nhất trong 1 class và không cho phép nạp chồng. Tên của hàm destructor cũng là tên class nhưng có ký tự “~” phía trước để phân biệt với hàm constructor. DESTRUCTOR – cont. Nếu 1 class không xây dựng hàm destructor tường minh  hàm default destructor sẽ được phát sinh cho class. Example: class point { 	private: 	int x; 	int y; 	public: 	~point(){} 	point(){x=4;y=5} 	int get_x() { return x;} } void main() { { point temp; printf(“X=%d”,temp.get_x()); } // call destructor for temp getch(); } STACK WITH CONSTRUCTOR & DESTRUCTOR typedef struct link { 	int data; 	link* next; 	link(int dt,link* nt) 	{ 	data=dt; 	next=nt; 	} ~link(){} }link; CONSTRUCTOR DESTRUCTOR STACK WITH CONSTRUCTOR & DESTRUCTOR – cont. class stack { 	private: 	link* phead; 	public:	 	stack() 	{ phead=null; } 	~stack(){ printf(“\n Call destructor.”);} 	void push(int ndata) 	{ 	phead=new link(ndata,phead); 	} 	 CONSTRUCTOR DESTRUCTOR STACK WITH CONSTRUCTOR & DESTRUCTOR – cont. int pop() 	{ 	if(phead==null) 	return -1; 	link* tlink =phead; 	int dt=phead->data; 	phead=phead->next; 	delete(tlink); 	return dt; } }; void main() { 	{ 	stack test; 	test.push(4); 	test.push(5); 	test.push(6); 	int x=test.pop(); // x=6; 	printf(“x1=%d\n”,x); //output: x=6 	x=test.pop(); //x=5; 	printf(“x2=%d”,x); //output: x=5 	} // call destructor at this point 	getch(); } STACK WITH CONSTRUCTOR & DESTRUCTOR – cont. COPY CONSTRUCTOR Được gọi thực thi khi bản sao của 1 đối tượng được tạo ra. Nhận tham số đầu vào duy nhất là 1 tham chiếu đến đối tượng thuộc cùng lớp. Tham số truyền vào nên được set là “tham chiếu hằng”. Hàm dựng sao chép mặc định được trình biên dịch phát sinh nếu class không định nghĩa 1 hàm copy constructor. COPY CONSTRUCTOR – cont. class point { 	public: 	int x; 	int* y; 	point(int xx,int yy) 	{ 	 x=xx; 	 y=new int(yy); 	}	 	~point(){} }; void main() { 	point p1(5,7); 	point p2=p1; 	delete(p1.y); 	int y=*p2.y; //giá trị rác } 7 5 xxx 5 xxx Heap p1 p2 point(const point& pt) { 	x=pt.x; 	y=new int(*pt.y); } ELIMINATION OF DEFINITION BLOCK C hướng lập trình viên khai báo các biến đầu scope (sau dấu “{“). 	+ Bất tiện khi cần khai báo biến mới. 	 + Cứng nhắc. C++ hỗ trợ tính năng khai báo biến mọi nơi trong thân scope “{}”. + Linh động trong khai báo và sử dụng biến. + Mã chương trình trực quan và dễ hiểu hơn. ELIMINATION OF DEFINITION BLOCK – cont. void main() { 	int x; 	printf(“\nNhap vao toa do x=”); 	scanf(“%d”,&x); 	int y=0; 	point test_p(x,y);	 } FOR LOOPS Cho phép định nghĩa nhanh các biến cục bộ sẽ sử dụng trong vòng lặp for. Các biến cục bộ chỉ tồn tại trong vòng lặp for. Example: for(int j = 0; j 10) 	goto label1; 	new_class test1; //error initialization of 'test1' is skipped by 'goto label1' label1:switch(x) 	{ 	case 1: 	 new_class test2; //error initialization of 'test2' is skipped by 'case' label 	break; 	case 2: 	new_class test3; 	break; 	} } AGGREGATE INITIALIZATION Cho phép khởi tạo 1 tập hợp nhiều đối tượng. Nếu tập hợp chứa n phần tử khi khai báo, trình biên dịch sẽ gọi n lần hàm constructor. Có thể khai báo kích thước mảng theo số lượng phần tử trong tập hợp hoặc sử dụng tính năng “automatic counting”. Example: struct pitxel { 	int x; 	int y; }; void main() { 	int a[3] = { 3, 4, 5}; int b[4]={2,4,1}; int c[2]={8,9,10}; // báo lỗi int d[]={2,4,6,10,6}; int nums=sizeof(d)/sizeof(*d); point arr[]={point(5,7),point(8,9)}; pitxel parr[]={{8,10},{5.7}}; } AGGREGATE INITIALIZATION–cont. THE END! 

File đính kèm:

  • pptInitialization & Cleanup.ppt