Tài nguyên dạy học

Thành viên trực tuyến

1 khách và 0 thành viên

Hỗ trợ trực tuyến

Điều tra ý kiến

Bạn thấy website của chúng tôi như thế nào?
Đẹp
Bình thường
Đơn điệu
Ý kiến khác

Thống kê

  • truy cập   (chi tiết)
    trong hôm nay
  • lượt xem
    trong hôm nay
  • thành viên
  • Ảnh ngẫu nhiên

    Video_13cailuongEnglish.flv Film_6_The_gioi_tu_nhien.flv CAU_TRUC_BAC_1.gif DSCN1679.jpg DSCN2125.jpg Kachiusa____YouTube1.flv TRAI_TIM_NHIEU_NGAN__Nguyen_Vu__YouTube.flv Trieu_doa_hong__Alla_Bugacheva__YouTube.flv IMG_1337.jpg IMG_1331.jpg Doi_b__YouTube.flv IMG01177.jpg FLASH_2011.swf Chom_chom_ly_qua_pha__Danh_hai_Chien_Thang__YouTube.flv Nguoi_thay_nam_xua.mp3 50_ban_thang_dep_nhat_lich_su.flv Toan_61.flv Vet_cham_tren_khuon_mat.flv

    lập trình C++ số 7

    Wait
    • Begin_button
    • Prev_button
    • Play_button
    • Stop_button
    • Next_button
    • End_button
    • 0 / 0
    • Loading_status
    Nhấn vào đây để tải về
    Báo tài liệu có sai sót
    Nhắn tin cho tác giả
    (Tài liệu chưa được thẩm định)
    Nguồn:
    Người gửi: Đặng Anh Tuấn (trang riêng)
    Ngày gửi: 23h:42' 09-09-2010
    Dung lượng: 56.0 KB
    Số lượt tải: 16
    Số lượt thích: 0 người
    Chương 7: Khuôn hình
    Nội dung chính
    Khuôn hình cho phép xây dựng các hàm và lớp tổng quát
    Khuôn hình hàm
    Khuôn hình lớp
    1. Định nghĩa khuôn hình
    Template cho phép định nghĩa một hàm có đặc điểm chung.
    C++ sử dụng template để tạo ra những thể hiện cụ thể của hàm khi cần thiết.
    Ví dụ: định nghĩa hàm max
    template
    kind max(kind d1, kind d2)
    {
    if (d1 > d2)
    return (d1);
    return (d2);
    }
    Cấu trúc báo cho C++ biết rằng kind có thể được thay thế bởi bất kỳ kiểu nào, kể cả là class hoặc một kiểu bất kỳ.
    Định nghĩa khuôn hình…
    Ví dụ: Sử dụng template
    main()
    {
    float f = max(3.5, 8.7);
    int i = max(100, 800);
    char ch = max(`A`, `Q`);
    int i2 = max(600, 200);
    }
    Khi C++ phát hiện câu lệnh: float f = max(3.5, 8.7); nó sẽ kiểm tra để xác định xem hàm max(float, float) đã có mã lệnh hay chưa và nó sẽ tự động tạo ra mã lệnh nếu chưa có.
    Chú ý rằng khi gặp câu lệnh int i2 = max(600, 200); thì nó sẽ không tạo ra mã lệnh cho hàm max(int,int) nữa vì nó đã tạo ra từ trước.
    Chuyên biệt hoá hàm
    Khi sử dụng hàm max để so sánh hai string như sau:
    main()
    {
    char *namel = "Able";
    char *name2 = "Baker";
    cout << max(namel, name2) << ` `;
    }
    Vì string được biểu diễn bởi một con trỏ (char *), nên câu lệnh if (dl > d2) sẽ so sánh giá trị của con trỏ chứ không phải nội dụng của con trỏ.
    Mà ta muốn C++ vẫn sử dụng cách so sánh với những dữ liệu thông thường, riêng đối với string thì phải sử dụng strcmp.
    Chuyên biệt hoá hàm …
    Thực hiện quá trình chuyên biết hoá (specialization). Ta định nghĩa lại hàm max chỉ dùng cho kiểu string.
    char *max(char *dl, char *d2)
    {
    if (strcmp(dl, d2) < 0)
    return (dl);
    return (d2);
    }
    Khi C++ phát hiện ra câu lệnh cout << max(namel, name2) << ` `; thì nó sẽ tìm những hàm thông thường có dạng max(char *, char *) , sau đó nó mới tìm đến template max(kind d1, kind d2).
    2. Khuôn hình lớp
    #include
    #include
    const int STACK_SIZE = 100; // số lượng phần tử lớn nhất trong Stack
    template
    class stack {
    private:
    int count; // Số lượng phần tử của Stack
    kind data[STACK_SIZE]; // Mảng chứa các phần tử của Stack
    public:
    stack (void) {count = 0; // Stack ban đầu rỗng}
    void push(const kind item) {
    data[count] = item;
    ++count;
    }
    kind pop(void) {
    --count;
    return (data[count]);
    }
    };
    Khuôn hình lớp …
    Nếu ta khai báo:
    stack a_stack; // câu lệnh không hợp lệ
    Stack là một template chung.
    Khi C++ nhìn thấy lệnh khai báo này, nó sẽ hỏi “stack nào?”.
    Phải xác định một kiểu dữ liệu cụ thể được lưu trong stack.
    Phải khai báo:
    stack a_stack; // Các phần tử trong stack là kiểu số nguyên
    Sau đó, ta có thể sử dụng stack như sau:
    a_stack.push(l);
    x = a_stack.pop();
    Khuôn hình lớp …
    Định nghĩa các hàm thành phần bên ngoài định nghĩa lớp như sau:
    template
    inline void stack::push(const kind item)
    {
    data[count] = item;
    ++count;
    }
    Chuyên biệt hoá lớp
    template stack { ...}
    Giới thiệu cho C++ biết cách tạo ra một tập các lớp có tên là stack, stack, stack,…
    C++ sẽ tự động tạo ra các hàm thành viên như: stack: :push, stack: :push, và stack::push.
    Nếu khai báo một hàm thành viên một cách tường minh thì C++ sẽ sử dụng định nghĩa này trước.
    inline void stack::push(const char * item)
    {
    data[count] = strdup(item);
    ++count;
    }
    Từ khoá template nói cho C++ biết ”Đây là class chung, hãy tạo ra một phiên bản tương ứng với nó”.
    Nếu không có từ khoá template, C++ sẽ hiểu đây là hàm chính thức và phải sử dụng nó trước.
     
    Gửi ý kiến