Sử Dụng Template Trong C++ Thế Nào (Phần 1)

Chúng tôi vui mừng chia sẻ kiến thức về từ khóa Template c la gi và hi vọng rằng nó sẽ hữu ích cho các bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và chọn lọc từ khóa phù hợp, kèm theo các chiến lược và công cụ hữu ích. Hi vọng rằng thông tin chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật kiến thức mới nhất.

Trong nội dung bài viết này mình sẽ hướng dẫn cách bạn tiếp cận tới một tri thức khá là quan trọng mà mỗi người học lập trình C++ đều phải ghi nhận và ứng dụng nó. Đó đó là Template.

Bạn Đang Xem: Sử Dụng Template Trong C++ Thế Nào (Phần 1)

1. Template trong C++ là gì?

  • Template (khuôn mẫu) là một từ khóa trong C++, và là một kiểu tài liệu trừu tượng tổng quát hóa cho những kiểu tài liệu int, float, double, bool…
  • Template trong C++ có 2 loại đó là function template & class template.
  • Template giúp người lập trình khái niệm tổng quát cho hàm và lớp thay vì phải nộp chồng (overloading) cho từng hàm hay phương thức với những kiểu tài liệu khác nhau.

2. Cách sử dụng template so với hàm

  • Cú pháp khai báo hàm khuôn mẫu

template <class Tvàgt; T someFunction(T arg1, …) { … }

Vì sao tất cả chúng ta phải dùng template nhỉ?

Các bạn thử xem ví dụ so với hàm swapVal() sau đây rồi tự rút ra nhận xét cho riêng mình nhé.

void swapVal(int &a , int &b) { int temp; temp = a; a = b; b = temp; }

Hàm swapVal(int &a , int &b) chỉ ứng dụng cho 2 biến kiểu int, do đó muốn đổi 2 biến với những kiểu tài liệu double, char, string… tất cả chúng ta phải overloading nó thêm một lần nữa

void swapVal(double &a , double &b) { double temp; temp = a; a = b; b = temp; }

Qua ví dụ trên tất cả chúng ta có thể thấy việc nạp chồng liên tục các hàm nhiều lần như vậy mất nhiều thời và bộ nhớ của máy tính, để tối ưu việc nạp chồng tất cả chúng ta sẽ xử lí chúng bằng phương pháp viết một hàm khuôn mẫu swapVal như sau:

Xem Thêm : Bull Trap là gì? Cách tránh bẫy Bull Trap trong chứng khoán

template <class valvàgt; void swapVal(val &a , val &b) { val temp; temp = a; a = b; b = temp; }

Tất cả chúng ta thử chạy xem sao nhé:

#include <bits/stdc++.hvàgt; using namespace std; template <class valvàgt; void swapVal(val &a , val &b) { val temp; temp = a; a = b; b = temp; } int main() { int intX = 2, intY = 3; double doubleX = 1.2, doubleY = 3.1; string str1 = “Code”, str2 = “Learn”; //gọi hàm swapVal() so với 2 số nguyên swapVal(intX, intY); cout << “intX = ” << intX << “tintY = ” << intY << endl; //gọi hàm swapVal() so với 2 số thực swapVal(doubleX, doubleY); cout << “doubleX = ” << doubleX << “tdoubleY = ” << doubleY << endl; //gọi hàm swapVal() so với 2 chuỗi swapVal(str1, str2); cout << “Str1 = ” << str1 << “tstr2 = ” << str2 << endl; return 0; }

Sau khoản thời gian chạy Khóa học sẽ có được kết quả:

Qua ví dụ trên tất cả chúng ta có thể thấy kiểu tài liệu của biến khái niệm chuẩn xác được quyết định ở thời khắc chạy, và Khóa học ngắn gọn hơn rất nhiều so với nạp chồng từng hàm swapVal()

Giảng giải:

  • Tiền tố khuôn mẫu
    • template <class valvàgt;
      • Ở đây class là kiểu hoặc sự phân lớp nên nó không phải là từ class tất cả chúng ta hay thấy ở trong lập trình hướng đối tượng người sử dụng.
      • C++ được chấp nhận sử dụng từ khóa “typename” ở vị trí từ khóa class , tuy nhiên tất cả chúng ta nên sử dụng từ khóa class trong mọi trường hợp.(Trong phần sau mình sẽ nói rõ khi nào dùng typename , khi nào dùng class)
      • Trong thân khái niệm hàm, val được sử dụng giống như một kiểu bất kì trùng với kiểu tài liệu truyền vào.
    • Từ val là tên gọi trượng trưng cho class nên có thể được thay thế bằng bất kì từ nào khác tất cả chúng ta muốn.
  • Khái niệm khuôn mẫu hàm:
    • Khuôn mẫu hàm swapVal() là một tập hợp các khái niệm.
    • Khi tất cả chúng ta chạy Khóa học với đối số truyền vào hàm swapVal() là kiểu int thì khi này trình biên dịch sẽ phát sinh khái niệm một hàm swapVal(intvàamp; a, intvàamp; b) mà không phát sinh ra các khái niệm cho những đối số kiểu float , double hay string. Do vậy tất cả chúng ta có thể tóm lại được rằng trình biên dịch chỉ phát sinh các khái niệm khi được yêu cầu với điều kiện kèm theo ta đã khái niệm cho tất cả những kiểu.
    • Thông qua đó ta có thể thấy ưu điểm vượt trội của template trong C++ là tất cả chúng ta viết một hàm khái niệm nó sẽ thao tác cho tất cả những kiểu có thể có.
  • Gọi khuôn mẫu hàm
    • Xét lời gọi hàm swapVal(intX,intY) bộ biên dịch C++ sử dụng khuôn mẫu để khởi tạo khái niệm hàm cho hai thông số int và tương tự với tất cả những kiểu khác.

Một số lưu ý khi viết hàm template:

  • Một template <class tempvàgt; , temp chỉ có tác vụ khái niệm cho một kiểu tài liệu duy nhất do đó tất cả chúng ta không thể gán 1 biến kiểu int và double cho cùng 1 kiểu tài liệu temp trong cùng một thời khắc.

Ví dụ:

#include <bits/stdc++.hvàgt; using namespace std; template <class tempvàgt; void sum(temp intVal , temp doubleVal) { coutvàlt;<int1+double1; } int main() { int intVal = 1; double doubleVal = 1.1; sum(intVal , doubleVal); return 0; }

Xem Thêm : Di tinh là gì? 6 câu hỏi giải mã hiện tượng này ở nam giới

Lớp học sẽ báo lỗi như ảnh dưới

Để giải quyết và xử lý vấn đề đó thì ta khai báo thêm một kiểu tài liệu tổng quát vào như sau:

#include <bits/stdc++.hvàgt; using namespace std; template <class temp , class temp1vàgt; void sum(temp intVal , temp1 doubleVal) { coutvàlt;<int1+double1; } int main() { int intVal = 1; double doubleVal = 1.1; sum(intVal , doubleVal); return 0; }

Khi chạy Khóa học ta sẽ nhận được kết quả là 2.1, từ đây tất cả chúng ta có thể thấy rằng khi ta muốn dùng bao nhiêu kiểu tài liệu tổng quát thì khai báo bấy nhiêu.

  • Khi lấy temp làm kiểu tài liệu trả về cho hàm, chúng cũng chỉ nhận kiểu tài liệu của biến trả về theo phong cách tài liệu của biến truyền vào mà không trả về một kiểu tài liệu khác được

#include <bits/stdc++.hvàgt; using namespace std; template <class tempvàgt; temp thuong(temp x1, temp x2) { return (x1*1.0)/x2; } int main() { int x1 = 1 , x2 = 2; coutvàlt;<thuong(x1,x2); return 0; }

Kết quả của Khóa học ra 0 bởi vì temp sẽ nhận kiểu tài liệu theo biến x1 , x2 đã được khái niệm trước kiểu int vì thế giá trị trả về là 0 mà không thể trả về kết quả như mong muốn là 0.5, do khi trình biên dịch chạy nó sẽ tự động hóa nhận kiểu tài liệu của biến truyền vào. Vì vậy khi viết khuôn hàm mẫu tất cả chúng ta nên cẩn thận trong trường hợp trả về kết quả như này nhé.

Tạm Kết

Vậy là tất cả chúng ta đã tìm hiểu được một phần của template trong C++, cụ thể là function template. Qua nội dung bài viết này mình mong các bạn nhớ được cú pháp, các dùng của function template và những lưu ý khi viết hàm template.

Mình mong các có thể làm được bài tập nhỏ mình đưa ra sau đây: “Viết một hàm có sử dụng khuôn mẫu nhập vào trong 1 mảng có những giá trị có kiểu tùy ý và trả về giá trị có số lần xuất hiện nhiều nhất trong mảng.” (bạn nào cần code thì comment gmail nhé)

Mong các bạn rate và comment ý kiến ở phía dưới để những bài sau mình ra tốt hơn. Cảm ơn các bạn hứa tái ngộ các bạn vào phần tiếp theo Class Template.

You May Also Like

About the Author: v1000

tỷ lệ kèo trực tuyến manclub 789club