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

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

WBOY
Lepaskan: 2024-04-11 22:03:01
asal
864 orang telah melayarinya

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;
};
Salin selepas log masuk

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;
}
Salin selepas log masuk

Perbezaan

Perbezaan utama antara templat kelas dan templat fungsi ialah:

  • Cara membuat instantiate: Templat kelas dibuat dengan menggunakan simbol <></gt;</gt; kod> Tatasusunan<int>) dijadikan instantiated secara eksplisit, manakala templat fungsi dibuat secara tersirat dengan memanggil fungsi dan menghantar hujah jenis (cth. max<int>(3, 5)) .
  • <> 符号(例如 Array<int>)显式实例化,而函数模板是通过调用该函数并传递类型参数(例如 max<int>(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;
};
Salin selepas log masuk

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

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

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

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

我们使用 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
Salin selepas log masuk
🎜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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan