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

