Lập trình hướng đối tượng - Chương 6: Thingking in C++

C++ cung cấp một giải pháp cho việc khởi tạo, gọi là constructor, cần thiết để tạo ra đối tượng với một vài thuộc tính ban đầu.

 

Tên của constructor trùng với tên class, ngoài ra, nó còn có thể có thêm tham số.

Có thể tạo nhiều constructor với số lượng tham số khác nhau.

 

 Hàm khởi tạo sẽ được gọi tự động khi một đối tượng của class đó được khai báo.

 

pptx25 trang | Chuyên mục: Lập Trình Hướng Đối Tượng | Chia sẻ: dkS00TYs | Lượt xem: 1790 | Lượt tải: 0download
Tóm tắt nội dung Lập trình hướng đối tượng - Chương 6: Thingking in C++, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
el Third level Fourth level Fifth level Click to edit Master title style Click to edit Master text styles Second level Third level Fourth level Fifth level Khởi tạo và hủy Chương 6 : Thinking in C++ Nguyễn Trung Kiên - 08520184 Nguyễn Công Huy - 08520148 1.Khởi tạo với constructor C++ cung cấp một giải pháp cho việc khởi tạo, gọi là constructor, cần thiết để tạo ra đối tượng với một vài thuộc tính ban đầu. Tên của constructor trùng với tên class, ngoài ra, nó còn có thể có thêm tham số. Có thể tạo nhiều constructor với số lượng tham số khác nhau. Hàm khởi tạo sẽ được gọi tự động khi một đối tượng của class đó được khai báo. Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 1.Khởi tạo với constructor Constructor nên đi kèm với một hàm hủy, gọi là destructor sẽ nói sau này. Khai báo một constructor : (,…) { 	//Các lệnh thực thi ở đây } Constructor vẫn được gọi khi dùng hàm goto() hay cấu trúc switch để nhảy qua một vị trí khác (nhảy qua hàm khởi tạo). Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 1.Khởi tạo với constructor Ví dụ : class meo //lớp mèo { int tuoi,canNang; public: 	meo(int Tuoi) 	{ 	tuoi=Tuoi; 	} 	meo(int Tuoi,int CanNang) 	{ 	tuoi=Tuoi; 	canNang=CanNang; 	} }; exam() là hàm khởi tạo Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 2.Hủy với destructor Việc hủy đối tượng sau khi sử dụng xong là rất cần thiết, nếu không nó sẽ không được giải phóng cho đến hết chương trình. C++ cung cấp một giải pháp cho việc hủy đối tượng, đó là dùng hàm hủy destructor, được khai báo ngay trong class Hàm hủy được gọi tự động ngay khi đối tượng bị hết phạm vi sử dụng. Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 2.Hủy với destructor Khai báo destructor gần giống với constructor, nhưng không có tham số, nó trùng tên với class, và có dấu ~ đằng trước. ~() { 	//Các lệnh thực thi ở đây } Lưu ý : Destructor vẫn được gọi khi sử dụng hàm goto() để nhảy sang vị trí khác, giống với constructor. Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 2.Hủy với destructor #include using namespace std; class Tree { 	int height; 	public: 	Tree(int initialHeight); // Constructor 	~Tree(); // Destructor 	void grow(int years); 	void printsize(); }; Tree::Tree(int initialHeight) { 	 height = initialHeight; } Tree::~Tree() { cout #include using namespace std; const int increment = 100; Stash::Stash(int sz) { 	size = sz; 	 quantity = 0; 	 storage = 0; 	 next = 0; } int Stash::add(void* element) { 	 if(next >= quantity) // Enough space left? 	 inflate(increment); // Copy element into storage, 	 // starting at next empty space: 	 int startBytes = next * size; 	unsigned char* e = (unsigned char*)element; 	for(int i = 0; i = next) 	return 0; // To indicate the end 	 // Produce pointer to desired element: 	return &(storage[index * size]); } int Stash::count() { 	return next; // Number of elements in Cstash } void Stash::inflate(int increase) { 	require(increase > 0, "Stash::inflate zero or negative increase"); 	int newQuantity = quantity + increase; 	 int newBytes = newQuantity * size; 	int oldBytes = quantity * size; 	 unsigned char* b = new unsigned char[newBytes]; 	for(int i = 0; i data; } void* Stack::pop() { 	if(head == 0) return 0; 	void* result = head->data; 	 Link* oldHead = head; 	head = head->next; 	delete oldHead; 	return result; } Stack::~Stack() { require(head == 0, "Stack not empty"); } ///:~ Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 5. Stack – khởi tạo và hủy. File StackTest.cpp #include "Stack3.h" #include "../require.h" #include #include #include using namespace std; int main(int argc, char* argv[]) { 	requireArgs(argc, 1); // File name is argument 	ifstream in(argv[1]); 	assure(in, argv[1]); 	Stack textlines; 	string line; 	// Read file and store lines in the stack: 	while(getline(in, line)) 	textlines.push(new string(line)); // Pop the lines from the stack and print them: 	string* s; 	while((s = (string*)textlines.pop()) != 0) 	 { 	 cout << *s << endl; 	delete s; 	} } ///:~ Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 5. Stack – khởi tạo và hủy. Hàm khởi tạo Link::Link() khởi tạo dữ liệu cho biến data và địa chỉ cho con trỏ next. Tại sao không hảm hủy Link::~Link không làm gì ? Đó là vì những lí do sau : + Không thể xóa một con trỏ khi con trỏ đó đang chỉ vào một vùng nhớ. + Nếu xóa bỏ dữ liệu (vùng nhớ của biến data) thì hàm pop() sẽ không thể trả về giá trị. Trình biên dịch sẽ báo lỗi. Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 6. Khởi tạo tập hợp Khi khai báo một mảng, nếu không xác định trước giá trị của các phần tử thì các phần tử sẽ có giá trị ngẫu nhiên Nếu không khai báo hết các phần tử thì những phần tử còn lại sẽ mang giá trị “không” (“không” không phải chỉ là số 0, mà là các giá trị “không” ứng với từng kiểu dữ liệu) Ví dụ : int a[3]={1,2}; thì a[1]=1, a[2]=2 và a[3]=0 Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 6. Khởi tạo tập hợp Tương tự với struct, bạn cũng có thể tạo một mảng gồm các struct, và các giá trị khởi đầu của mảng đó cũng được xác định như đã nói ở trên. Ví dụ : typedef struct { 	int i; 	char c; } exam; main() { 	exam e[2]={3,’a’}; } Thì phần tử thứ nhất sẽ có giá trị như trên, phần tử còn lại có cac giá trị “không”. Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 7. Khởi tạo mặc định Khởi tạo mặc định là khởi tạo mà không có tham số. Khi không tạo một khởi tạo nào thì C++ sẽ tự tạo ra một hàm khởi tạo mặc định. Tuy nhiên điểu này không được khuyến khích vì hàm này hầu như không có tác dụng gì nhiều. Người dùng nên tự tạo hàm khởi tạo mặc định riêng. class exam{ int i; };	//không có hàm khởi tạo Int main() { 	exam ex, ex2[2];	//hàm khởi tạo }	//mặc định Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 7. Khởi tạo mặc định Khi khai báo một mảng struct exam với một struct đã và chỉ có một hàm khởi tạo có tham số như sau : exam ex[2]={exam(1)} ; thì phần tử thứ 2 sẽ tự động tìm một hàm khởi tạo mặc định. Nhưng do không có hàm đó, nên trình biên dịch sẽ báo lỗi. Vấn đề tương tự cũng xảy ra khi bạn khai báo như sau : exam ex[2]; hay exam ex;  Phải chắc chắn rằng khi đã tạo một hàm khởi tạo có tham số thì cũng phải tạo một hàm khởi tạo mặc định (không tham số) Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập 8. Tổng kết Những kĩ thuật tỉ mỉ của C++ đã gợi ý cho bạn về việc khởi tạo và hủy một đối tượng. Stroustrup, tác giả của ngôn ngữ C++, đã tìm hiểu rất kĩ về C, để nhận thấy rằng C có rất nhiều vấn đề trong việc khởi tạo và hủy đối tượng. Những lỗi này có thể gây ra những hậu quả nghiêm trọng, đôi khi khó nhận ra. Constructor và destructor trong C++ cho phép bạn khởi tạo và hủy an toàn hơn. Bởi vậy, có thể nói rằng, an toàn trong viết code là một kết quả lớn của C++. Và như đã tìm hiểu ở trên, khởi tạo và hủy cũng an toàn như vậy. Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập Bài tập Viết một class, in ra một vài thứ, đẻ cho biết một hàm khởi tạo đã được gọi. Thêm vào một hàm hủy, trong đó có lệnh in ra cho biết hàm hủy đã được gọi. Sửa class đó, thêm vào một biến int, rồi viết hàm khởi tạo có tham số, rồi gán cho biến đó. Chứng minh rằng hàm hủy vẫn được gọi khi bị lệnh goto nhảy qua. Viết ra hai vòng lặp for, vòng thứ nhất khai báo một biến đếm ở ngoài vòng, vòng thứ hai khai báo một biến đếm ngay trong cấu trúc điều khiển của vòng lặp, theo dõi trình biên dịch xử lí thế nào ? Sử dụng khởi tạo tập hợp để tạo ra một mảng double nhưng không cung cấp hết giá trị cho các phần tử. In ra phần tử của mảng, sử dụng sizeof để tính kích thước mảng. Bây giờ tạo một mảng sử dụng khởi tạo tập hợp và tính kích thước tự động. Sử dụng khởi tạo mảng để tạo ra một mảng các chuỗi. Tạo ra một Stack giữ các chuỗi này, sau đó dùng pop() để xuất các chuỗi này ra. Tạo ra một class không có hàm khởi tạo, chứng minh rằng bạn có thể tạo một class với hàm khởi tạo mặc định. Bây giờ tạo một hàm khởi tạo có tham số, rồi thử lại. Giải thích vấn đề. Mục lục 1.Khởi tạo với constructor 	 2.Hủy với destructor 3. Việc hủy của các khối 4. Stash - khởi tạo và hủy 5. Stack – khởi tạo và hủy 6. Khởi tạo tập hợp 7. Khởi tạo mặc định 8. Tổng kết Bài tập Cảm ơn sự chú ý theo dõi. Kết thúc 

File đính kèm:

  • pptxLập trình hướng đối tượng - Chương 6 Thingking in C++.pptx