Initiallization & clearup

. C++ đã có 1 cải tiến đầy ý nghĩa là gom những dữ liệu rời rạc lại và đóng gói chúng thành 1 kiểu đặt biệt gọi là những class

 

VấN Đề PHÁT SINH :

Có thể sẽ có lỗi trình dịch xảy ra khi lập trình viên quên (initialization) khởi tạo và ( cleanup ) giải phóng các một biến nào đó trong C .

Trong C không cho phép người ta initialize 1 truct ngay cả khi họ muốn

Trong C++ việc khởi tạo và giải phóng thì tương đối dễ dàng , giúp tránh được những lỗi khó phát hiện .

 

pptx16 trang | Chuyên mục: Lập Trình Hướng Đối Tượng | Chia sẻ: dkS00TYs | Lượt xem: 1603 | Lượt tải: 0download
Tóm tắt nội dung Initiallization & clearup, để 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 10/22/2009 ‹#› Initiallization& clearup Reference : Thinking in C++ Vol 1 – chapter 6 Nguyễn Việt Quốc & Lê Đình Bảo Review . C++ đã có 1 cải tiến đầy ý nghĩa là gom những dữ liệu rời rạc lại và đóng gói chúng thành 1 kiểu đặt biệt gọi là những class VấN Đề PHÁT SINH : Có thể sẽ có lỗi trình dịch xảy ra khi lập trình viên quên (initialization) khởi tạo và ( cleanup ) giải phóng các một biến nào đó trong C . Trong C không cho phép người ta initialize 1 truct ngay cả khi họ muốn Trong C++ việc khởi tạo và giải phóng thì tương đối dễ dàng , giúp tránh được những lỗi khó phát hiện . Constructor là hàm tự chạy khi ta khai báo class . Tên của constructor được đặt giống với tên của class khi ta khai báo class : ví dụ : class X { int i; public: X(); //  Constructor }; Void f() { 	X a; //Khi ta khai báo a thuộc lớp X thi X::X() sẽ tự chạy } Các constructor không trả về giá trị (nói rõ hơn đó chỉ là những thủ tục ) Khởi tạo các Constructor Trong C++ thì việc initailization cũng như cleanup điều quan trọng như nhau . Nếu các constructor là hàm dùng cho việc initailization thì destructor dùng cho thao tác cleanup . Hàm destructor được trình dịch gọi tự động sau khi object ra khỏi nơi mà nó có tác dụng . Cách khai báo distructor : Distructor được khai báo như 1 thủ tục trong 1 class nhưng có systax “~” ở phía trước . Thủ tục này có tên trùng với tên của class Ví dụ 	class Y { 	public : 	~Y(); 	}; Destructor – (cleanup) 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; //Biến y được định nghĩa khi cần G g(y); } ///:~ Elimination of the definition block Trong 1 ngôn ngữ lập trình khi sử dụng đến 1 vòng lặp for ta cần 1 biến làm bộ đếm trong vòng lặp này Ví dụ : Int i ;//biến đếm cho vòng lặp for (i=1;i<=100;i++) cout<<i ; Trong C++ có thể được khai báo khác đi for(int i=1;i<=100;i++) cout<< i;//điều này không làm được trong C Biến i sẽ được giải phóng khi vòng lặp kết thúc Trong Vòng lặp for Elimination of the definition block Một đối tượng bao gồm constructor được khai báo trong chương trình ở bất kì mọi nơi người lập trình cần nó  Nó sẽ không tồn tại cho đến khi người ta khai báo nó trong chương trình . Trình dịch sẽ đều đặn kiểm tra xem các constructor có được thực thi hay không . Trong trường hợp constructor bị bỏ qua bởi các lệnh nhảy như goto hay swich trình dịch sẽ báo lỗi Storage allocation Elimination of the definition block //: C06:Nojump.cpp // Can't jump past constructors class X { public: X(); }; X::X() {} void f(int i) { if(i < 10) { //! goto jump1; // Error: goto bypasses init } Ví dụ Elimination of the definition block X x1; // Constructor called here jump1: switch(i) { case 1 : X x2; // Constructor called here break; //! case 2 : // Error: case bypasses init X x3; // Constructor called here break; } } int main() { f(9); f(11); }///:~ Khi ta bỏ các ghi chú bôi vàng trình dịch sẽ báo lỗi vì lúc đó jump sẽ bỏ qua các khai báo object trong đó có các constructor Một mảng (array) là tổng hợp nhiều phần tử của một kiểu dữ liệu đơn. C++ hỗ trợ chúng ta trong quá trình khởi tạo tập hợp. Khi tiến hành khai báo một tập hợp, chỉ cần khai báo kiểu dữ liệu được dùng, quá trình khởi tạo sẽ được xử lý bởi trình biên dịch. Obj bạn tạo ra sẽ phụ thuộc vào kiểu dữ liệu bạn đang làm việc, nhưng trong tất cả các trường hợp, phần tử trong tập hợp phải được đặt trong dấu {}. Vd : một mảng được định nghĩa sẵn Int[5]={1,2,3,4,5}; Trường hợp bạn initalize quá nhiều so với bạn định nghĩa thì trình dịch sẽ báo lỗi . Và ngược lại trình dịch sẽ tự động thêm vào 0 . khởi tạo tập hợp Aggregate initialization 1 Cách khác đơn giản hơn ta có thể khai báo : Int c[]={1,2,3,4,5} ; Trình dịch sẽ tự động đếm phần tử của mảng c ; Và bạn có thể dùng sizeof c /sizeof* c để biết được c có bao nhiêu phần tử . khởi tạo tập hợp Aggregate initialization Với struct ta có thể làm 	 	struct X { 	int i; 	float f; 	char c; 	}; 	X x1 = { 1, 2.2, 'c' }; 	X x2[3] = { {1, 1.1, 'a'}, {2, 2.2, 'b'} }; 	// với x2 thì phần tử thứ 3 được khởi tạo là 0; khởi tạo tập hợp Aggregate initialization Và trường hợp struct có constructor : 	struct Y { 	 float f; 	 int i; 	 Y(int a); 	}; 	Y y1[] = { Y(1), Y(2), Y(3) }; khởi tạo tập hợp Aggregate initialization Bạn hãy thử nghĩ về trường hợp này 	struct Y { 	 float f; 	 int i; 	 Y(int a); 	}; 	Y y1[3] = { Y(1), Y(2)}; //câu lệnh 1 	Y y2; //câu lệnh 2 // trình Duyệt sẽ báo lỗi là không tìm thấy default constructor cho cả hai câu lệnh 1 và 2 Chú Ý : trình duyệt bắt buộc constructor phải luôn được chạy khởi tạo tập hợp Default Constructor Aggregate initialization Câu hỏi ? 

File đính kèm:

  • pptxInitiallization & clearup.pptx