クラステンプレート(C ++)

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();
}

第三に、クラステンプレートの導出

  1. 通常のクラス派生クラステンプレート
  2. クラステンプレートは、クラステンプレートから派生させることもできます。この場合、派生クラステンプレートのパラメータテーブルには、基本クラステンプレートのパラメータが含まれている必要があります。
  3. テンプレートクラスには、通常のクラスと同様に多重継承があります。つまり、テンプレートクラス間で多重継承が許可されます。

新しいクラスは、クラステンプレートまたは非テンプレートクラスのいずれかから、クラステンプレートから派生させることができます。

//类模板派生普通类
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などの異なるタイプのクラステンプレートオブジェクトの静的メンバーは共有されていないことがわかります。

おすすめ

転載: blog.csdn.net/weixin_45341339/article/details/111993632