Bài giảng Lập trình hướng đối tượng - Khởi tạo và làm sạch

Trong C++, khái niệm khởi tạo và dọn dẹp là điều cần thiết cho thư viện sử dụng dễ dàng và để loại bỏ các lỗi có thể xảy ra khi chương trình khách hàng quên thi hành các hoạt động này. Chương này trình bày việc kiểm tra các tính năng trong C++ giúp khởi tạo và don dẹp tốt hơn.

Cả lớp Stash và lớp Stack được định nghĩa trước đây có một hàm được gọi là initialize(), theo tên của nó là nên gọi nó trước khi sử dụng một đối tượng trong các trường hợp khác nhau.

 

 

pptx34 trang | Chuyên mục: Lập Trình Hướng Đối Tượng | Chia sẻ: dkS00TYs | Lượt xem: 1557 | Lượt tải: 2download
Tóm tắt nội dung Bài giảng Lập trình hướng đối tượng - Khởi tạo và làm sạch, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 Click to edit Master title style Click to edit Master text styles Second level Third level Fourth level Fifth level 21/10/2009 ‹#› Khởi tạo và làm sạch Trong C++, khái niệm khởi tạo và dọn dẹp là điều cần thiết cho thư viện sử dụng dễ dàng và để loại bỏ các lỗi có thể xảy ra khi chương trình khách hàng quên thi hành các hoạt động này. Chương này trình bày việc kiểm tra các tính năng trong C++ giúp khởi tạo và don dẹp tốt hơn. Cả lớp Stash và lớp Stack được định nghĩa trước đây có một hàm được gọi là initialize(), theo tên của nó là nên gọi nó trước khi sử dụng một đối tượng trong các trường hợp khác nhau. Khởi tạo và làm sạch Sự bảo đảm thiết lập với hàm khởi tạo: Thiết kế lớp bảo đảm sự khởi tao của mỗi đối tượng bằng cách cung cấp một hàm đặc biệt gọi là hàm khởi tạo. Nếu mỗi lớp có một hàm khởi tạo, trình biên dịch tự động gọi hàm khởi tạo tại một điểm của đối tượng đã đươc tạo, trước khi chương trình khách hàng truy xuất vào một đối tượng. Tên của hàm khởi tạo trùng với tên của lớp. Có cảm giác như là một hàm sẽ được gọi tự động khi khởi tạo. Khởi tạo và làm sạch Đây là một lớp nhỏ với hàm khởi tạo: class X { int i; public: X(); // Constructor }; Khi một đối tượng được định nghĩa, void f() { X a; // ... } Khởi tạo và làm sạch Cả hàm khởi tạo và hàm hủy là kiểu dữ liệu khác của các hàm. Nó không có giá trị trả về. Nó khác với giá trị trả về kiểu void, trong các hàm không có giá trị trả về nhưng bạn vẫn có thể thay đổi giá trị trả về. Hàm khởi tạo và hàm hủy không có kiểu trả về và bạn không được thay đổi giá trị trả về.Việc mang một đối tượng vào hoặc ra chương trình là điều đặc biệt, giống như việc sinh ra và chết đi, và trình biên dịch luôn tạo ra hàm gọi lại chính nó, để đảm bảo rằng chúng có xảy ra. Nếu nó có giá trị trả về. Trình biên dịch sẽ phải biết làm gì với giá trị trả lại, hoặc chương trình khách phải gọi hàm khởi tạo và hàm hủy. Khởi tạo và làm sạch Xóa bỏ các khối định nghĩa C++ sẽ không cho phép bạn tạo một đối tượng trước khi có các thông tin khởi tạo của cấu trúc. Bởi vì điều này, ngôn ngữ sẽ không khả thi nếu bạn đã xác định biến tại đầu của một phạm vi. Trong thưc tế, các phong cách của ngôn ngữ lập trình khuyến khích định nghĩa đối tượng gần điểm đang sử dụng. Trong C++, bất kỳ qui tắc áp dụng nào cho một đối tượng tự động đề cập tới một đối tượng có kiễu sẵn có là tốt. Có nghĩa là bất kỳ lớp đối tượng hoặc biến sẵn có có thể được định nghĩa ở một điểm của một phạm vi. Nó cũng có nghĩa rằng bạn có thể đợi cho đến khi bạn có thông tin về một biến trước khi định nghĩa nó, vù vậy bạn có thể luôn định nghĩa và khởi tạo cùng một lúc. Khởi tạo và làm sạch Đảm bảo sạch với destructor : Bạn thường nghĩ về tầm quan trọng của khởi tạo, nhưng hiếm khi bạn nghĩ về việc làm. Nhưng nếu không làm sạch thì sẽ không an toàn bộ nhớ của bạn. Trong C++, dọn dẹp ( làm sạch )cũng quan trọng như khởi tạo và do đó nó đảm bảo với destructor. Cú pháp của destructor tương tự như các constructor: tên lớp được sử dụng như tên chức năng. Tuy nhiên các destructor phân biệt với constructor bàng một dấu ngã(~). Destructor không cần đối số vì tiêu hủy không cần bất cứ tùy chọn nào. class Y { public: ~Y Khởi tạo và làm sạch Destructor được gọi là tự động bởi trình biên dịch khi đối tượng khi ra khỏi phạm vi. Bạn có thể thấy nơi mà các constructor được gọi là điểm định nghĩa của đối tượng,nhưng các bằng chứng cho ta thấy có một cuộc gọi destructor là đóng khối phạm vi bao quanh đối tượng. Vào lúc này destructor vẫn được gọi, ngay cả khi bạn bạn sử dụng goto đễ nhảy ra khỏi một phạm vi.(goto vẫn tồn tại trong C++ cho su tương thích chậm với C và cho các lần khi có ích ). Bạn nên lưu ý rằng một nonlocal goto,được thực thi bởi thư viện c chuẩn chức năng setjmp() và longjmp() không làm destructors được gọi.( Đây là đặc điểm kỹ thuật, thậm chí nếu bạn trình biên dịch không thực hiện nó theo cách đó. Dựa vào một tính năng mà không phải là đặc điểm kỹ thuật phương tiện mã của bạn là nonportable.) Khởi tạo và làm sạch //: C06:Constructor1.cpp // Constructors & destructors #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; class G { int i; public: G(int ii); }; G::G(int ii) { i = ii; } int main() { cout > retval; require(retval != 0); int y = retval + 3; G g(y); } ///:~ Khởi tạo và làm sạch Bạn có thể thấy vài đoạn mã được thi hành, sau đó relval được định nghĩa, khởi tạo, và được dùng để bắt người sử dụng phải nhập vào, và sau đó y và g được định nghĩa. C mặt khác không cho phép một biến được định nghĩa bất cứ chỗ nào ngoại trừ đầu phạm vi. Khởi tạo và làm sạch Nói chung bạn cần định nghĩa biến càng gần điểm của họ sử dụng nhất có thể.(Điều này là một gợi ý cho việc gắn liền các kiểu, nơi khởi tạo là tùy ý). Đây là cách cấp phát an toàn. Bằng việc giảm thời gian tồn tại của biến trong phạm vi. Ngoài ra chương trình sẽ dễ đọc hơn bởi vì người đọc không phải quay trở lại và ra vào đầu phạm vi để biết kiểu dữ liệu của biến. Khởi tạo và làm sạch Vòng lặp for Trong C++, bạn sẽ thường thấy một vòng lặp for được định nghĩa ngay trong biểu thức for: for(int j = 0; j #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 } Khởi tạo và làm sạch 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 #include #include using namespace std; int main() { Stash intStash(sizeof(int)); for(int i = 0; i #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; } } ///:~ Khởi tạo và làm sạch Trong trường hợp này, tất cả các dòng textlines được popped và xóa bỏ,nhưng nếu không, bạn sẽ nhận được một yêu cầu () thông báo có nghĩa là rò rỉ bộ nhớ. Khởi tạo và làm sạch Tổng hợp khởi tạo: Tổng hợp là cái gì đó nghe như là: một bó được kết lại cùng nhau. Định nghĩa này bao gồm tập hợp các loại hỗn hợp, như cấu trúc và các lớp. Một mảng là một tổng hợp của một kiểu duy nhất. . Khởi tạo tổng hợp C++ thì an toàn hơn. Khi bạn tạo một đối tượng đó là một khối, tất cả các bạn phải làm là tạo một phân công, và khởi tạo sẽ được chăm sóc bởi trình biên dịch. Điều phân cồng này sẽ thêm vào một số chuyện, tùy thuộc vào kiểu của khối bạn đang xử lý, nhưng trong tất cả các trường hợp các yếu tố trong nhiệm vụ phải được bao quanh bởi ngoặc nhọn. Một mảng được xây dưng kiểu này khá đơn giản: int a[5] = { 1, 2, 3, 4, 5 }; Khởi tạo và làm sạch Default constructs.(các hàm khởi tạo mặt định) Một hàm khởi tạo mặt định là một hàm có thể được gọi mà không cần các đối số. Một hàm khởi tạo mătj định được sử dụng để tạo ra một “đối tượng vani”, nhưng nó cũng quan trọng khi trình biên dịch bảo là tọ một đối tượng nhưng không định sẵn một cách chi tiết. Nhớ rằng, nếu bạn có một hàm khởi tạo, trình biên dịch bảo đảm rằng hàm khởi tạo luôn được gọi, bất chấp mọi tình huống. Hàm khởi tạo quan trọng đến nỗi mà nếu (và chỉ nếu) không có hàm khởi tạo cho cấu trúc (struct hay class), trình biên dịch sẽ tự động tạo một đối tượng. Khởi tạo và làm sạch . Do đó những việc này : //: C06:AutoDefaultConstructor.cpp // Automatically-generated default constructor class V { int i; // private }; // No constructor int main() { V v, v2[10]; } ///:~ Nếu bất kỳ hàm khởi tạo nào được định nghĩa, tuy nhiên, và không có hàm khởi tạo mặt định, thí dụ lớp V ở trên sẽ làm cho trình biên dịch báo lỗi. Khởi tạo và làm sạch Tóm tắt: Bề ngoài phức tạp của cơ cấu của C++ cho bạn những điều về khởi tạo và dọn dẹp hết sức quan trọng của ngôn ngữ lập trình. Môt trong những lời nhận xét đầu tiên, bạn làm được tạo ra trong C là phân chia ý nghĩa của chương trình 

File đính kèm:

  • pptxBài giảng Lập trình hướng đối tượng - Khởi tạo và làm sạch.pptx