1.はじめに
クラステンプレートと関数テンプレートの定義と使用法は似ています。関数が同じで、データ型のみが異なるクラスが2つ以上ある場合があります。
- クラステンプレートは、クラスに必要なデータの型パラメータ化を実現するために使用されます
- クラステンプレートは、配列、テーブル、グラフなどのデータ構造を表す場合に特に重要です。これらのデータ構造の表現とアルゴリズムは、含まれるデータタイプの影響を受けません。
2.文法
C ++でのクラステンプレートの記述は次のとおりです。
template <类型参数表>
class 类模板名{
成员函数和成员变量
};
タイプパラメータテーブルは次のように記述されます。
class类塑参数1, class类型参数2, ...
クラステンプレート定義の外部のクラステンプレートにメンバー関数を書き込むための構文は次のとおりです。
template <类型参数表>
返回值类型 类模板名<类型参数名列表>::成员函数名(参数表)
{
...
}
クラステンプレートを使用してオブジェクトを定義する方法は次のとおりです。
类模板名<真实类型参数表> 对象名(构造函数实际参数表);
クラステンプレートにパラメーターなしのコンストラクターがある場合は、次の記述を使用することもできます。
类模板名 <真实类型参数表> 对象名;
例:
template<class T>
class Person{
public:
Person(T id,T age){
this->mAge = age;
this->mId = id;
}
void Show(){
cout << "ID:" << mId << " Age:" << mAge << endl;
}
public:
T mId;
T mAge;
};
void main(){
//函数模板在调用的时候,可以自动类型推导
//类模板必须显式指定类型
Person<int> p(15,22);
p.Show();
}
第三に、クラステンプレートの導出
- 通常のクラス派生クラステンプレート
- クラステンプレートは、クラステンプレートから派生させることもできます。この場合、派生クラステンプレートのパラメータテーブルには、基本クラステンプレートのパラメータが含まれている必要があります。
- テンプレートクラスには、通常のクラスと同様に多重継承があります。つまり、テンプレートクラス間で多重継承が許可されます。
新しいクラスは、クラステンプレートまたは非テンプレートクラスのいずれかから、クラステンプレートから派生させることができます。
//类模板派生普通类
template<class T>
class Person{
public:
Person(){
mAge = 0;
}
public:
T mAge;
};
//类区定义对象,这个对象需要编译分配内存,要指定类型
class SubPerson : public Person<int>{
};
//类模板派生类模板
template<class T>
class Animal{
public:
void J(){
cout << mAge << "动物在叫!" << endl;
}
public:
T mAge;
};
template<class T>
class Cat : public Animal<T>{
};
int main(void)
{
Cat<int> cat;//指定类型
return 0;
}
第四に、クラステンプレート外のメンバー関数の実装
template<class T>
class Person{
public:
Person(T age, T id);
void Show();
private:
T mAge;
T mID;
};
//外部实现函数
template<class T>
Person<T>::Person(T age, T id){
this->mID = id;
this->mAge = age;
}
template<class T>
void Person<T>::Show(){
cout << "Age:" << mAge << " ID:" << mID << endl;
}
5、クラステンプレートのコンパイル
まず、コンパイルユニット(--Search.com Unit)は* .cppファイルを参照し、すべての.hファイルを#includeします。.hファイルコードはその.cppファイルを含むように展開され、コンパイラー.cppファイルは.objファイル(プラットフォームがwin32であると仮定)、後者はPE *(Portable Executable、つまりWindows実行可能ファイル)ファイル形式であり、バイナリコードが含まれていますが、実行できない可能性があります。main関数が必要であることを保証します。コンパイラーがプロジェクト内のすべての* .cppファイルを個別の方法でコンパイルした後、それらはリンカーによって接続されて.exe *ファイルになります。
クラスと同じように、クラステンプレートは、その実装と宣言をまとめたり、インターフェイスを実装から分離したりできます。ただし、歴史的な理由により、コンパイラによる個別コンパイルのサポートは非常に弱く、サポートの強さはプラットフォームによって異なります。
STLのクラステンプレートはすべてインターフェイスと実装と一緒にまとめられており、主流に従うことができます。(ファイルは***クラスtemplate.hpp ***として保存されます。その本質は、.cppの実装コードを.hヘッダーファイルに混合することです。定義と実装は同じファイルに含まれ、このクラスの呼び出し元は、hppファイルをインクルードするだけでよく、コンパイルするためにプロジェクトにcppを追加する必要はありません。)
6、クラステンプレートのstaticキーワード
異なる型パラメーターを持つクラスの静的メンバー変数は、クラステンプレートの実装メカニズムによって決定される、互いに独立しています。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
template<class T>
class Person{
public:
static int a;
};
template<class T> int Person<T>::a = 0;//类外初始化
int main(void)
{
Person<int> p1, p2, p3;
Person<char> pp1, pp2, pp3;
p1.a = 10;
pp1.a = 100;
cout << p1.a << " " << p2.a << " " << p3.a << endl;//输出10 10 10
cout << pp1.a << " " << pp2.a << " " << pp3.a << endl;//输出100 100 100
return 0;
}
intなどの同じタイプのクラステンプレートオブジェクトの静的メンバーは共有されており、int、float、charなどの異なるタイプのクラステンプレートオブジェクトの静的メンバーは共有されていないことがわかります。