Bài giảng Lập trình hướng đối tượng - Chương 10: Template và điều khiển ngoại lệ
• Hàm template
• Lớp template
• Điều khiển ngoại lệ
• Biến tĩnh
• Từ khoá extern và asm
• Hàm chuyển kiểu
• Những khác biệt giữa C và C++
Tóm tắt nội dung Bài giảng Lập trình hướng đối tượng - Chương 10: Template và điều khiển ngoại lệ, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
on } if(!inuse) inuse = who; // get buffer if(inuse != who) return -1; // in use by someone else if(str[i]) { // still chars to output outbuf[oindex] = str[i]; i++; oindex++; outbuf[oindex] = '\0'; // always keep null-terminated return 1; } return 0; } void show() { cout << outbuf << '\n'; } }; char output::outbuf[255]; // this is the shared resource int output::inuse = 0; // buffer available if 0; in use otherwise int output::oindex = 0; // index of outbuf int main() { Chương 10 Template và điều khiển ngoại lệ 328 output o1(1, "This is a test"), o2(2, " of statics"); while(o1.putbuf() | o2.putbuf()) ; // output chars o1.show(); return 0; } Kết quả chương trình ? Bài tập IV 1. Viết lại chương trình trong ví dụ 4.3 chương 10, để có thể trình bày tên của đối tượng đang truy cập đến vùng đệm và tên các đối tượng đang bị cấm truy cập vùng đệm. 2. Biến tĩnh được ứng dụng để theo dõi số lượng các đối tượng của một lớp tồn tại ở một thời điểm bất kỳ. Bằng cách sẽ tăng trị số đếm của một biến tĩnh mỗi lúc hàm tạo của lớp được gọi, và làm giảm trị số đếm mỗi khi hàm hủy của lớp được gọi. Viết chương trình tạo một lớp test có biến tĩnh count là biến riêng, một hàm tạo, hàm hủy và hàm getcount() trả về gía trị của count. Chương trình có sử dụng 3 đối tượng và một con trỏ đối tượng p. V/ Từ khoá extern và asm C++ cung cấp hai cơ chế quan trọng làm cho việc kết nối giữa chương trình C++ và chương trình ngôn ngữ khác trở nên dễ dàng hơn. Cơ chế 1 : bộ chỉ định kết nối (extern) dùng để thông báo với trình biên dịch rằng một hay một số hàm nào đó trong chương trình sẽ được kết nối với một ngôn ngữ khác, và chúng có thể có những qui ước khác về việc truyền tham số. Dạng tổng quát extern “Language” { function_prototypes Chương 10 Template và điều khiển ngoại lệ 329 } Language : tên của ngôn ngữ mà hàm của chương trình cần kết nối function_prototypes : các hàm cần kết nối Tất cả các chỉ định kết nối phải mang tính toàn cục và nó không thể nằm bên trong một hàm. Ngoài ra có thể chỉ định kết nối cho các đối tượng (ít xảy ra). Ví dụ 5.1 Chương trình sau kết nối hàm func() theo kiểu hàm của C hơn là hàm của C++ // Illustrate linkage specifier. #include extern "C" int func(int x); // link as C function // This function now links as a C function. int func(int x) { return x/3; } Ví dụ 5.2 Đoạn chương trình sau thông báo với trình biên dịch rằng f1(), f2(), f3() sẽ được kết nối như các hàm của C. extern "C" { void f1(); int f2(int x); double f3(double x, int *p); } Cơ chế 2 : từ khoá asm cho phép lập trình viên nhúng đoạn mã lệnh hợp ngữ vào trong chương trình nguồn C++. Ưu điểm : chương trình ứng dụng hoàn toàn là một chương trình C++ và nó không cần phải kết nối với các file chương trình hợp ngữ khác. Dạng tổng quát Chương 10 Template và điều khiển ngoại lệ 330 asm(“op_code”) ; op_code là một câu lệnh hợp ngữ nhúng trong chương trình. Lưu ý Turbo C++ và Borland C++ chấp nhận một số dạng khác nhau của mệnh đề asm : asm op_code; asm op_code newline; asm { // statements; } Ví dụ 5.3 Đoạn chương trình sau nhúng nhiều câu lệnh hợp ngữ vào hàm func() // Don't try this function! void func() { asm("mov bp, sp"); asm("push ax"); asm("mov cl, 4"); // ... } Bài tập V 1. Nghiên cứu tài liệu hướng dẫn sử dụng các trình biên dịch sau đây, những nội dung liên quan đến chỉ định kết nối và giao tiếp với asembly : - Borland C++ version 4.5 hoặc cao hơn - Visual C++ version 6.0 hoặc cao hơn VI/ Hàm chuyển kiểu Chương 10 Template và điều khiển ngoại lệ 331 Việc chuyển đổi một đối tượng thuộc kiểu này thành một đối tượng kiểu khác tỏ ra hữu ích trong một số trường hợp. Có thể sử dụng quá tải toán tử để thực hiện việc chuyển đổi, nhưng cách sử dụng hàm chuyển kiểu là một giải pháp dễ dàng và hay hơn. Một hàm chuyển kiểu thực hiện tự động việc chuyển đổi một đối tượng thành một giá trị tương thích với kiểu của biểu thức mà đối tượng đó có tham gia. Dạng tổng quát operator type() { return value; } type là kiểu cần chuyển value là gía trị của đối tượng sau khi được chuyển Hàm sẽ trả về gía trị thuộc kiểu type. Hàm chuyển kiểu không có tham số và nó phải là hàm thành phần của lớp trong đó hàm thực hiện việc chuyển kiểu. Hàm chuyển kiểu cung cấp một cách tiếp cận sáng sủa hơn cho việc chuyển kiểu của đối tượng so với các phương pháp của C++, bởi vì nó cho phép một đối tượng được sử dụng trực tiếp trong biểu thức thuộc kiểu cần chuyển đến. Ví dụ 6.1 Lớp coord có một hàm chuyển kiểu thành kiểu nguyên. Hàm trả về gía trị tích của hai toạ độ // A simple conversion function example. #include class coord { int x, y; public: coord(int i, int j) { x = i; y = j; } operator int() { return x*y; } // conversion function Chương 10 Template và điều khiển ngoại lệ 332 }; int main() { coord o1(2, 3), o2(4, 3); int i; i = o1; // automatically convert to integer cout << i << '\n'; i = 100 + o2; // convert o2 to integer cout << i << '\n'; return 0; } @ Bằng cách dùng hàm chuyển kiểu, các lớp tự tạo được hoà nhập vào trong một biểu thức thông thường của C++ mà không cần phải sử dụng một mảng các toán tử qúa tải rất phức tạp. Ví dụ 6.2 Lớp strtype có một hàm chuyển kiểu chuyển chuổi ký tự thành một con trỏ đến chuổi str #include #include class strtype { char str[80]; int len; public: strtype(char *s) { strcpy(str, s); len = strlen(s); } operator char *() { return str; } // convert to char* }; int main() { Chương 10 Template và điều khiển ngoại lệ 333 strtype s("This is a test\n"); char *p, s2[80]; p = s; // convert to char * cout << "Here is string: " << p << '\n'; // convert to char * in function call strcpy(s2, s); cout << "Here is copy of string: " << s2 << '\n'; return 0; } @ Hàm chuyển kiểu không chỉ được gọi khi đối tượng s bị gán cho con trỏ p, mà còn được gọi khi đối tượng s được dùng như một tham số của hàm strcpy() có dạng char *strcpy(char *s1, char *s2) ; Vì s2 có kiểu char *, nên hàm chuyển kiểu thành char * sẽ được gọi thực thi một cách tự động. @ Như vậy hàm chuyển kiểu có thể giúp lập trình viên tích hợp các lớp tự tạo vào thư viện hàm chuẩn của C++ một cách êm thấm. Bài tập VI 1. Qua lớp strtype trong ví dụ 7.2 chương 10, viết chương trình tạo ra một hàm chuyển sang kiểu nguyên. Hàm sẽ trả về gía trị là chiều dài của chuỗi ký tự str. 2. Cho một lớp sau class pwr { int base; int exp; public: pwr(int b, int e) {base = b; exp = e;} // create conversion to integer here }; Chương 10 Template và điều khiển ngoại lệ 334 Hãy tạo ra một hàm chuyển một đối tượng kiểu pwr thành kiểu nguyên. Hàm sẽ trả về gía trị của biến base. VII/ Những khác biệt giữa C và C++ C++ là một siêu tập hợp của C, vẫn có một số khác biệt giữa C và C++, sự khác biệt này có thể làm cho trình biên dịch C++ không biên dịch được một số chương trình C nào đó. Do đó lập trình viên cần nắm vững để viết một chương trình C++ được tốt. Các khác biệt C C++ 1/ Hàm không có đối số Nguyên mẫu của hàm có từ khoá void Vd : char f1(void); Từ khoá void là tuỳ ý Vd : char f1(); 2/ Hằng ký tự được tự động chuyển thành số nguyên Không thể 3/ Biến toàn cục khai báo nhiều lần ở nhiều nơi Không báo lỗi báo lỗi 4/ Tên (identifier) tối đa 31 ký tự 1024 ký tự 5/ Gọi hàm main() Từ bên trong chương trình Cho phép, không nên lạm dụng Bài tập chương 10 Chương 10 Template và điều khiển ngoại lệ 335 1. Sự khác biệt giữa các biến tĩnh và các biến khác của một lớp là gì ? 2. Ngoài việc nhập/xuất theo mảng sử dụng bộ nhớ như một thiết nhập/xuất, còn có sự khác biệt nào giữa nó và nhập/xuất thông thường trong C++ hay không ? 3. Hãy viết một hàm int counter(int array[], int size) đếm số các phần tử của array có gía trị lẻ dưới dạng ngôn ngữ C, làm thế nào liên kết vào chương trình C++ có sử dụng lớp. 4. Hãy tạo ra hàm chung trả về giá trị mode của một mảng (giá trị mode là giá trị bắt gặp nhiều trong dãy) và số lần xuất hiện của nó. 5. Hãy tạo hàm tính và trả về giá trị tổng của các phần tử trong một mảng ? 6. Hãy tạo ra hàm chung thực hiện một số giải thuật sắp xếp (đã học trong môn Cấu trúc dữ liệu và thuật toán) 7. Viết chương trình định nghĩa lại lớp stack để nó lưu trữ một cặp gồm hai đối tượng có kiểu dữ liệu khác nhau. 8. Viết chương trình định nghĩa lại lớp stack để nó có khả năng xử lý các lỗi : full stack và empty stack . 9. Viết chương trình định nghĩa lại lớp array trong ví du 7.3 chương 3 , chuyển lớp này thành một lớp chung. 10. Viết chương trình định nghĩa hàm chung abs() trong ví du 3.7 chương 1, sao cho nó tính và trả về giá trị tuyệt đối của một giá trị thuộc bất kỳ kiểu nào.
File đính kèm:
- bai_giang_lap_trinh_huong_doi_tuong_tap_1_chuong_10_template.pdf