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++

 

pdf39 trang | Chuyên mục: C/C++ | Chia sẻ: tuando | Lượt xem: 432 | Lượt tải: 0download
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:

  • pdfbai_giang_lap_trinh_huong_doi_tuong_tap_1_chuong_10_template.pdf