Tài liệu LẬP TRÌNH C nâng cao - BÀI 4 - TEMPLATE doc

4 497 2
Tài liệu LẬP TRÌNH C nâng cao - BÀI 4 - TEMPLATE doc

Đang tải... (xem toàn văn)

Thông tin tài liệu

LẬP TRÌNH C/C++ NÂNG CAO Yêu cầu trước khi đọc: học xong Lập trình C/C++ căn bản BÀI 4: TEMPLATE Hàm template Giả sử chúng ta cần viết một hàm trả về số nguyên lớn nhất giữa 2 số CODE int maximum(int a,int b) { return (a>b)?a:b; } Rồi đến số thực chúng ta cũng làm như vậy CODE double maximum(double a,double b) { return (a>b)?a:b; } Rồi giả sử như với lớp Person chúng ta cũng phải làm như vậy (toán tử > đã được overload) CODE Person maximum(Person a,Person b) { return (a>b)?a:b; } C++ cung cấp một giải pháp cho vấn đề này, đó là template CODE template<class T>T maximum(T a,T b) { return (a>b)?a:b; } int main() { int a=7;int b=5; cout<<maximum(a,b); return 0 } template với nhiều hơn một kiểu dữ liệu CODE template<class T,typename U>void func(T a,U b); Dùng template với mảng CODE template<class T,int size>void print(T (&a)[size]) { for(int i=0;i<size;i++) cout<<a[i]<<endl; } Lớp template (template class) CODE template<class T>class pair { T values[2]; public: pair(T first,T second) { values[0]=first; values[1]=second; } T getmaximum(); }; template<class T>T pair<T>::getmaximum() { return (values[0]> values[1])? values[0]: values[1]; } Trong hàm main CODE pair<int> myobject(155,36); myobject.getmaximum(); Thật tuyệt, đúng không ? Vấn đề không đơn giản như vậy. Đau đầu Xem lại hàm template dưới đây CODE template<class T>T maximum(T a,T b) { return (a>b)?a:b; } Ví dụ dưới đây thực ra là đang so sánh địa chỉ bộ nhớ (memory address) của 2 biến a và b CODE char* a = "hello";char* b = "world"; cout<<maximum(a,b); Ví dụ dưới đây cũng là đang so sánh địa chỉ bộ nhớ (memory address) của 2 biến a và b div, id: post-25916, class: postcolor CODE int a[3],b[3]; cout<<maximum(a,b); Vậy phải làm sao ? (Trong lập trình, những vấn đề tưởng như nhỏ nhặt thế này thực ra gây đau đầu lắm đó, nhất là khi phải làm dự án từ 1000 words trở lên. Mà đặc biệt riêng lập trình game đụng những chuyện đau đầu này thường xuyên hơn các phân ngành IT khác. Biên dịch thành công, mà tại sao nó … kì cục vầy nè ?) Cứu tinh xuất hiện, đó _______________là một tham chiếu mà tham chiếu đến một con trỏ (a reference which refers to a pointer). Đây là dạng đau đầu nhất của tham chiếu. A reference which refers to a pointer CODE int* p; //một con trỏ p bình thường int*& r = p; //tham chiếu r là nickname mới của p r = new int; //tương đương với p = new int *r = 5; //tương đưong với *p = 5 cout<<*p; //tương đương với cout<<*r Và như vậy, vấn đề khó khăn với dữ liệu kiểu mảng đã được giải quyết. CODE template<class T>T* maximum(T*& a,T*& b) { return (*a>*b)?a:b; } int main() { char* a="bb"; char* b="aa"; cout<<maximum(a,b); return 0; } Lưu ý là chỉ có "một tham chiếu mà tham chiếu đến một con trỏ" và "một con trỏ mà trỏ đến một con trỏ khác", chứ không thề có những khái niệm như "một tham chiếu mà tham chiếu đến một tham chiếu khác" hay "một con trỏ mà trỏ đến một tham chiếu" đâu nhá. Hết khó khăn chưa ? Chưa đâu. . LẬP TRÌNH C/ C++ NÂNG CAO Yêu c u trư c khi đ c: h c xong Lập trình C/ C++ c n bản BÀI 4: TEMPLATE Hàm template Giả sử chúng ta c n viết một. return 0 } template với nhiều hơn một kiểu dữ liệu CODE template& lt;class T,typename U>void func(T a,U b); Dùng template với mảng CODE template& lt;class

Ngày đăng: 14/12/2013, 09:15

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan