Tải bản đầy đủ (.ppt) (57 trang)

BÁO CÁO LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Tìm hiểu về mẫu hàm (function template), mẫu lớp (class template)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (211.86 KB, 57 trang )

BÀI TẬP LỚN
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Giảng viên hướng dẫn: Ngô Công Thắng
Nhóm thực hiện : Nguyễn Thị Huyền
Phan Thị Chương
Nguyễn Thị Thu Quỳnh
Dương Thị Thanh Thúy
Lớp : THC_K52

Nội dung
A) LÝ THUYẾT
I. KHUÔN MẪU ( template ) trong C++
1. Định nghĩa
2. Khuôn mẫu hàm(Function template)
3.Khuôn mẫu lớp (Class template)
4 . Một số Template có sẵn
5. Tổng kết về Template
II) SƠ LƯỢC VỀ THƯ VIỆN STL
1.Định nghĩa STL.
2. Thư viện chuẩn các mảng chứa.
3. Thư viện chuẩn tổng quát.
4. Thư viện chuẩn các dãy ký tự.
5. Thư viện chuẩn Streams và input/output.
6. Thư viện chuẩn các số
8. Các thành phần chính của STL gồm:
7. Thư viện chuẩn hỗ trợ ngôn ngữ lập trình.
III. CÁCH SỬ DỤNG LỚP STRING CHUẨN VÀ
CÁC HÀM THÀNH VIÊN CỦA LỚP NÀY.
1.Cách sử dụng lớp String
2.Các hàm thành viên của lớp này
B .CHƯƠNG TRÌNH


A) LÝ THUYẾT
I. KHUÔN MẪU ( template ) trong C++
1) Định nghĩa

Template là một tính năng chỉ có trong C++, nó
được giới thiệu bởi tổ chức đo lường chuẩn của
Mỹ (ANSI)

Template (khuôn mẫu) là một cơ chế thay thế mã cho
phép tạo các cấu trúc mà không phải chỉ rõ kiểu dữ liệu.

Từ khoá template được dùng trong C++ để báo cho
trình biên dịch rằng đoạn mã theo sau sẽ thao tác một
hoặc nhiều kiểu dữ liệu chưa xác định.

Từ khoá template được theo sau bởi một cặp ngoặc
nhọn chứa tên của các kiểu dữ liệu tuỳ ý được cung
cấp.

Cú Pháp

template <typename T>

template <typename T, typename U>
Lệnh template chỉ có hiệu quả đối với khai báo ngay sau


Một VD về template:
template <class myType>
myType GetMax (myType a, myType b)

{
return (a>b?a:b);
}

Hai loại khuôn mẫu cơ bản:

Function template (Khuôn mẫu hàm ): khuôn mẫu
hàm cho phép định nghĩa các hàm tổng quát dùng đến
các kiểu dữ liệu tuỳ ý.

Class template (Khuôn mẫu lớp): khuôn mẫu lớp cho
phép định nghĩa các lớp tổng quát dùng đến các kiểu dữ
liệu tuỳ ý.
2) Khuôn mẫu hàm(Function template)

Mẫu hàm là những hàm có những chức năng đặc biệt ,
có thể hoạt động chung với các loại. Điều này cho phép
tạo ra một mẫu có những chức năng và những tính
năng có thể được điều chỉnh để phù hợp với nhiều hơn
một loại hoặc các lớp học mà không có sự lặp đi lặp lại
toàn bộ mã số cho từng loại.


Trong C / C + + mẫu hàm có thể được tạo ra bằng cách
sử dụng các “tham số mẫu”.Tham số mẫu là một loại
đặc biệt của tham số,nó có thể được sử dụng để truyền
vào một đối số: Giống như các hàm thông thường các
tham số có thể được sử dụng để truyền giá trị cho một
hàm, các tham số mẫu cũng cho phép truyền các kiểu
tới 1 hàm


Các mẫu hàm có thể sử dụng các tham số này nếu
chúng là bất cứ một kiểu thông thường nào khác
a. Khai báo
Khai báo mẫu của nó có thể là một trong hai kiểu sau:

template <class identifier> function_declaration

template <typename identifier> function_declaration
b. Cú pháp cài đặt mẫu hàm
Chúng ta sẽ xác định cú pháp cài đặt mẫu hàm
thông qua ví dụ sau:

Ví dụ hàm trị tuyệt đối
template<class T>
T abs(T n)
{
Return ((n<0)? –n : n;
}
Đây là toàn bộ cú pháp một mẫu hàm

Dòng đầu tiên bắt đầu với từ khóa template và theo
sau là định nghĩa hàm.

Từ khóa template báo cho trình biên dịch biết là chúng
ta đang định nghĩa một mẫu hàm.

Tư khóa class trong 2 dấu < > cũng có thể gọi là type
bởi vì chung ta có thể định nghĩa các kiểu dữ liệu của
riêng chúng ta nên thật sự không có gì phân biệt giữa

các kiểu và các lớp.Biến theo sau từ khóa class( là T
trong ví dụ trên) được gọi là đối số mẫu
c. Ý Nghĩa

Ưu điểm

Tiết kiệm được mã nguồn -> dễ bao quát, dễ kiểm soát
lỗi nâng cao hiệu quả lập trình

Đảm bảo được tính chặt chẽ về kiểm tra mạnh trong
ngôn ngữ lập trình

Tính mở, nâng cao giá trị sử dụng lại của phần mềm :
thuật toán viết một lần sử dụng vô số lần

Đảm bảo hiệu suất tương đương như viết tách từng
hàm riêng biệt

Cho phép xây dựng các thư viện chuẩn rất mạnh ( các
thuật toán thông dụng như sao chép, tìm kiếm, sắp xếp,
lựa chọn

Nhược điểm

Nếu muốn đảm bảo tính mở hoàn toàn thì người sử
dụng khuôn mẫu hàm cũng phải có mã nguồn thực thi

Mã nguồn thực thi cần được đặt trong header file

Khó bảo vệ chất xám


Việc theo dõi, tìm lỗi trình biên dịch nhiều khi gặp khó
khăn

Lỗi nhiều khi nằm ở mã sử dụng, nhưng lại được báo
trong mã định nghĩa khuôn mẫu hàm

Định nghĩa và sử dụng không đúng cách có thể dẫn tới
gia tăng lớn về mã đích, bởi số lượng hàm khuôn mẫu
có thể được tạo ra quá nhiều không cần thiết

Ví dụ:
// mẫu hàm
#include <iostream.h>
template <class T>
T GetMax (T a, T b)
{
T result;
result = (a>b)? a : b;
return (result);
}
int main ()
{
int i=5, j=6, k;
long l=10, m=5, n;
k=GetMax<int>(i,j);
n=GetMax<long>(l,m);
cout << k << endl;
cout << n << endl;
return 0;

}
3.Khuôn mẫu lớp
3.1.Khái niệm

Có thể sử dụng template để xây dựng một khuôn hình
lớp trong đó kiểu thuộc tính được xem như là các
đối.Bằng cách đó ta có thể tạo ra một họ các lớp giống
nhau về bản chất xử lý,nhưng khác nhau về kiểu dữ liệu.

Khuôn hình lớp là những lớp được xây dựng trong
đó các thành phần dữ liệu hoặc các hàm thành phần
của lớp sử dụng các kiểu dữ liệu trừu tượng.Khi chương
trình có nhu cầu sử dụng lớp với những kiểu dữ liệu cụ
thể thì chương trình dịch sẽ tự động biên dịch những thể
hiện thích hợp nhất.

Ta chỉ phải viết định nghĩa các khuôn hình lớp một
lần rồi sau đó có thể áp dụng chúng với các kiều dữ liệu
khác nhau để được các lớp thể hiện khác nhau
3.2.Ý nghĩa :
.
Giả sử cần tạo một lớp Stack lưu trữ dữ liệu kiểu int như sau:
Class stack
{
Private:
Int st[MAX]; //mảng số nguyên
Int top; //chỉ số của đỉnh ngăn xếp
Public:
Stack(); //hàm tạo
Void push(int var); //có đối số kiểu int

Int pop(); //trả về kiểu int
};

Lớp stack này chỉ có thể lưu trữ dữ liệu kiểu int. Nếu bây giờ chúng
ta muốn lưu trữ dữ liệu kiểu float thì chúng ta cần định nghĩa lại lớp
hoàn toàn mới:
Class longstack
{
Private:
long st[MAX]; //mảng số nguyên
long top; //chỉ số của đỉnh ngăn xếp
Public:
longStack(); //hàm tạo
Void push(long var); //có đối số kiểu long
long pop(); //trả về kiểu long
};
Bởi vậy, nếu chúng ta có thể viết một lớp mà có thể làm việc được
với tất cả các kiểu dữ liệu cơ bản thì sẽ tốt hơn rất nhiều. Và các
mẫu lớp cho phép chúng ta làm điều đó.

Mẫu lớp thường được sử dụng cho các lớp lưu trữ
dữ liệu(các container).Ví dụ ngăn xếp(stack) là một ví dụ
về lớp lưu trữ.

Trong thực tế bạn phải tạo một công việc hoàn toàn
giống nhau nhưng lại làm trên các kiểu dữ liệu khác
nhau.
Ví dụ như bạn tạo CStack.
Các hàm Push, Pop hoàn toàn xử lí giống
nhau. Nhưng lại có Stack kiểu int, Stack kiểu char hoặc

cả Stack kiểu class do bạn định nghĩa ra. Do đó nếu viết
cho mỗi kiểu dữ liệu 1 Stack thì quá mất thời gian. Do
đó mởi sử dụng mẫu lớp

Như vậy có thể nói rằng sử dụng mẫu lớp mang
lại ý nghĩa rất to lớn .Chỉ cần viết một một mô tả lớp mà
có thể làm việc được với tất cả các dữ liệu cơ bản

Khuôn hình lớp giúp chúng ta có thể tạo ra các lớp mà không
cần định nghĩa cho kiểu dữ liệu của lớp tại thời điểm khai báo
lớp. Chúng ta cũng có thể sử dụng class templates để xây
dựng các lớp giống nhau về bản chất xử lý nhưng khác nhau về
kiểu dữ liệu. Chúng ta có thể khai báo mẫu lớp như sau:

template <class myType>

class C

{

//Khai báo các thành phần của lớp C

}

Khi cần sử dụng mẫu lớp này ta chỉ việc gọi tên mẫu lớp với
kiểu dữ liệu cần dùng. VD: C <int> i(a,b);
Dưới đây là một số mẫu lớp thường được dùng:

template <class T>; //Kiểu phổ biến với một tham số kiểu.


template <class T, class U>; //Hai tham số kiểu.

template <class T, int N> //Một tham số kiểu, một tham số giá
trị.

template <class T = char> //Với một giá trị ngầm định.

template <int TFunc (int)> //Hàm là một tham số cho template
3.3.Khai báo

Các đối ứng với các kiểu dữ liệu được khai báo như
sau:

template<class T1,class T2,… ,class Tm>

Chú ý
Khuôn hình lớp trong đó có sử dụng các đối T1,T2,
…,Tm phải được viết ngay sau dòng khai báo nói trên.

Các đối T1,T2,…,Tm là đối của chỉ khuôn hình lớp này.
3.4. Tham số khuôn hình

Tham số kiểu đại diện cho một kiểu dữ liệu trừu
tượng.Một khuôn hình lớp có thể sử dụng được nhiều
tham số kiểu

Tham số biểu thức :đối với khuôn hình lớp được tham
số biểu thức sử dụng để tạo ra những lớp thể hiện linh
động hơn.Giá trị truyền cho tham số biểu thức phải là
các hằng số.Ta có thể khai báo một số tùy ý các tham số

biểu thức trong danh sách các tham số của khuôn hình
hàm.Các tham số này có thể xuất hiện ở bất cứ nơi nào
trong định nghĩa của khuôn hình lớp.Khi sản sinh một
lớp có các tham số biểu thức,các tham số thực tế tương
ứng phải là các biểu thức hằng phù hợp với kiểu dữ liệu
đã khai báo trong danh sách các tham số hình thức của
khuôn hình lớp
3.5.Cách sử dụng khuôn hình lớp

Các mẫu lớp thường được dùng cho các lớp lưu trữ dữ
liệu(các container)

Dùng khuôn hình lớp để tạo một các đối tượng với các
kiểu dữ liệu bất kỳ,bằng các câu lệnh khai báo,new,hàm
tạo.

Ví dụ có thể tạo ra các đối tượng List với kiểu dữ liệu
bất kỳ như sau:

List <int > x(20);

List <Myclass> u(30);

Sử dụng các phương thức để xử lý các đối tượng tạo ra

Ví dụ dùng phương thức chỉ số và phép gán:

x[3] =7;

u[10]=m;//m là một đối tượng kiểu List

4 . Một số Template có sẵn

CArray : template class dùng để tạo ra mảng với các
phần tử có kiểu tuỳ ý. CArray cung cấp các mảng tương
tự như mảng trong C nhưng với CArray bạn có thể tăng
hoặc giảm số lượng các phần tử khi cần thiết. Chỉ số
của mảng (array index) luôn bắt đầu từ 0. Các truy suất
CArray cũng tương tự như array trong C.

CList : template class dùng để tạo ra list với các phần tử
có kiểu tuỳ ý. CList cung cấp các danh sách liên kết đôi
đã được sắp xếp.

CMap : template class dùng để tạo ra "map" với các
phần tử có key và kiểu tuỳ ý. Giá trị key là duy nhất trong
một "map". Dùng CMap bạn có thể coi nó như một cuốn
tự điển dể tra cứu 1 cách dễ dàng các phần tử.

×