Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah perbezaan antara templat kelas dan templat fungsi untuk fungsi C++?

Apakah perbezaan antara templat kelas dan templat fungsi untuk fungsi C++?

WBOY
WBOYasal
2024-04-11 22:03:01755semak imbas

Templat C++ termasuk templat kelas dan templat fungsi. Templat kelas membenarkan penciptaan kelas yang boleh digunakan dengan jenis data yang berbeza, manakala templat fungsi boleh digunakan dengan fungsi jenis data yang berbeza. Perbezaan utama antara kedua-duanya ialah templat kelas diwujudkan secara eksplisit, dan templat fungsi secara tersirat dalam templat kelas, parameter jenis boleh dilihat dalam keseluruhan definisi kelas, manakala dalam templat fungsi ia hanya kelihatan dalam tandatangan.

C++ 函数的类模板和函数模板有何区别?

Templat Kelas lwn. Templat Fungsi dalam C++

Templat C++ ialah ciri bahasa yang berkuasa yang membolehkan kami mencipta kod boleh guna semula yang boleh digunakan dengan pelbagai jenis data. C++ menyediakan dua jenis templat: templat kelas dan templat fungsi.

Templat Kelas

Templat kelas membolehkan kami mencipta kelas yang boleh digunakan untuk jenis data yang berbeza. Dalam erti kata lain, ia membolehkan kami membuat pelan tindakan yang boleh digunakan untuk mencipta objek dengan jenis data yang berbeza seperti integer, terapung atau kelas tersuai yang lain.

template <typename T>
class Array {
public:
    Array(int size) : size(size), data(new T[size]) {}
    ~Array() { delete[] data; }
    T& operator[](int index) { return data[index]; }

private:
    int size;
    T* data;
};

Templat Fungsi

Templat fungsi membolehkan kami mencipta fungsi yang boleh digunakan pada jenis data yang berbeza. Begitu juga, ia membolehkan kami mencipta templat yang boleh digunakan untuk mencipta fungsi dengan jenis parameter yang berbeza dan jenis nilai pulangan.

template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

Perbezaan

Perbezaan utama antara templat kelas dan templat fungsi ialah:

  • Cara membuat instantiate: Templat kelas dibuat dengan menggunakan simbol a8093152e673feb7aba1828c43532094;; kod> Tatasusunanbd43222e33876353aff11e13a7dc75f6) dijadikan instantiated secara eksplisit, manakala templat fungsi dibuat secara tersirat dengan memanggil fungsi dan menghantar hujah jenis (cth. maxbd43222e33876353aff11e13a7dc75f6(3, 5)) .
  • a8093152e673feb7aba1828c43532094 符号(例如 Arraybd43222e33876353aff11e13a7dc75f6)显式实例化,而函数模板是通过调用该函数并传递类型参数(例如 maxbd43222e33876353aff11e13a7dc75f6(3, 5))隐式实例化的。
  • 可见性:类模板中的类型参数在整个类定义中都可见,而函数模板中的类型参数仅在函数签名中可见。

实战案例

类模板:创建一个 Pair 类模板,它存储两个不同类型的值。

template <typename K, typename V>
class Pair {
public:
    Pair(K key, V value) : key(key), value(value) {}
    K getKey() { return key; }
    V getValue() { return value; }

private:
    K key;
    V value;
};

我们使用 Pair 类模板创建了一个存储整数键和字符串值的 Pair 对象:

Pair<int, string> pair(1, "C++");
cout << pair.getKey() << " " << pair.getValue() << endl; // 输出:1 C++

函数模板:创建一个 swap 函数模板,用于交换两个不同类型值的顺序。

template <typename T>
void swap(T& a, T& b) {
    T temp = a;
    a = b;
    b = temp;
}

我们使用 swap

Keterlihatan: 🎜Parameter jenis dalam templat kelas boleh dilihat di seluruh definisi kelas, manakala parameter jenis dalam templat fungsi hanya boleh dilihat dalam tandatangan fungsi. 🎜🎜Kes praktikal🎜🎜🎜🎜Templat kelas: 🎜Buat templat kelas Pair, yang menyimpan dua jenis nilai yang berbeza. 🎜
int x = 1;
int y = 2;
swap(x, y); // 互换 x 和 y 的值
cout << x << " " << y << endl; // 输出:2 1
🎜Kami menggunakan templat kelas Pair untuk mencipta objek Pair yang menyimpan kunci integer dan nilai rentetan: 🎜rrreee🎜🎜Templat fungsi: 🎜Buat pertukaran Templat fungsi, digunakan untuk menukar susunan dua jenis nilai yang berbeza. 🎜rrreee🎜Kami menggunakan templat fungsi swap untuk menukar dua integer: 🎜rrreee

Atas ialah kandungan terperinci Apakah perbezaan antara templat kelas dan templat fungsi untuk fungsi C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn