C++におけるクラステンプレートの概念と意義

14908 ワード

1,C++で汎用的な思想をクラスに応用できるかどうか.
1、関数テンプレートは汎用プログラミングの思想を関数に応用し、関数テンプレートがある.
2、よく使うC++標準ライブラリはC++の中の標準テンプレートライブラリで、C++の中のSTLは汎用的な思想を一連の関数に応用して、関数テンプレートを得て、もちろん多くの種類のテンプレートもあります;
3,クラステンプレートは汎用思想をC++の中のクラスに応用して得た新しい概念である.
 
2、クラステンプレート:
1、一部のクラスは主にデータ要素の格納と組織に用いられる.
1,クラステンプレートはデータ構造のために誕生したものである.
2、クラス内のデータ組織の方式はデータ要素の具体的なタイプとは関係ない.
3、例えば:配列類、チェーンテーブル類、Stack類、Queue類など;
1,C++はテンプレートの思想をクラスに応用し、クラスの実現はデータ要素の具体的なタイプに注目せず、クラスが実現する機能だけに注目する.
      
3,C++のクラステンプレート:
1、異なるタイプを同じ方法で処理する.
2、クラス宣言の前にtemplateを使用して識別する.
3,クラスで使用される汎用指タイプTを説明するために使用される.
1、コード例:
1 template < typename T >
2 class Operator  // class            
3 {
4 public:
5     T op(T a, T b)  // T                  ,       ;
6 };

4、クラステンプレートの応用:
1、指定された特定のタイプしか表示できず、自動的に導くことができません.
2具体的なタイプを使用してオブジェクトを定義します.
1、コード例:
1 Operator<int> op1;
2 Operator<string> op2;
3  int i = op1.op(1, 20);
4 string s = op2.op("D.T.", "Software");

             
4、クラステンプレート:
1,宣言された汎指タイプTはクラステンプレートの任意の場所に現れることができる.
2、コンパイラのクラステンプレートに対する処理方式は関数テンプレートと同じである.
1、クラステンプレートから特定のタイプによって異なるクラスを生成する.
1、コンパイラはクラステンプレートを1つのモジュールとして、このモジュールは多くの実質的なクラスを生成することができる.
2、宣言された場所でクラステンプレートコード自体をコンパイルする.
3、使用する場所でパラメータ置換後のコードをコンパイルする.
      
5,クラステンプレートの初期プローブプログラミング実験:
 1 #include 
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 template < typename T >
 7 class Operator  //                ,     Operator                 +、-、*、/       ,                      ,         ;                   ;
 8 {
 9 public:
10     T add(T a, T b)
11     {
12         return a + b;
13     }
14     
15     T minus(T a, T b)
16     {
17         return a - b;
18     }
19     
20     T multiply(T a, T b)
21     {
22         return a * b;
23     }
24     
25     T divide(T a, T b)
26     {
27         return a / b;
28     }
29 };
30 
31 string operator-(string& l, string& r)  //          -    ,    ;    、   
32 {
33     return "Minus";  //
34 }
35 
36 int main()
37 {
38     Operator<int> op1;
39     
40     cout << op1.add(1, 2) << endl;  // 3;
41     
42     Operator<string> op2;  //              ,                      ,      ,          ,        ,    ,      ;
43     
44     cout << op2.add("D.T.", "Software") << endl;  // D.T.Software;        add()          ;
45     cout << op2.minus("D.T", "Software") << endl;  //           -        ,         ,  ;                           ;        minus()          ;        -       ,   Minus ;
46     
47     return 0;
48 }

1,コンパイラはクラステンプレートの第1回コンパイルをクラステンプレート自体のコードに対してコンパイルする.
2、2回目のコンパイルは、クラステンプレートを使用して、各メンバー関数を時計回りに独立してコンパイルします.
   
6、クラステンプレートのエンジニアリング応用:
1クラステンプレートはヘッダファイルで定義する必要があります.
2、クラステンプレートは別々に異なるファイルに実現できない.
3、クラステンプレートの外部定義のメンバー関数にテンプレート<>宣言を付ける必要があります.
1,クラステンプレートのメンバー関数実装をクラステンプレートの外部実装に置く;
2,以上の3つのルールはC++やコンパイラの一部ではなく、エンジニアリングアプリケーションで慣れているだけで、コードのメンテナンス性、拡張性がよくなるので、この3つのルールを守ることをお勧めします.
 
7、テンプレート類の工程応用プログラミング実験:
1,ヘッダファイル(名前はクラス名と同じ)Operator.hの内容:
 1 #ifndef _OPERATOR_H_  //
 2 #define _OPERATOR_H_
 3 
 4 template < typename T >
 5 class Operator
 6 {
 7 public:
 8     T add(T a, T b);
 9     T minus(T a, T b);
10     T multiply(T a, T b);
11     T divide(T a, T b);
12 };
13 
14 template < typename T >  //
15 T Operator::add(T a, T b)  // add()   Operator     ;
16 {
17     return a + b;
18 }
19 
20 template < typename T >
21 T Operator::minus(T a, T b)
22 {
23     return a - b;
24 }
25 
26 template < typename T >
27 T Operator::multiply(T a, T b)
28 {
29     return a * b;
30 }
31 
32 template < typename T >
33 T Operator::divide(T a, T b)
34 {
35     return a / b;
36 }
37 
38 #endif

2,ヘッダファイルの応用;
 1 #include 
 2 #include <string>
 3 #include "Operator.h"
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     Operator<int> op1;
10     
11     cout << op1.add(1, 2) << endl;  // 3;
12     cout << op1.multiply(4, 5) << endl;  // 20;
13     cout << op1.minus(5, 6) << endl;  // -1;
14     cout << op1.divide(10, 5) << endl;  // 2;
15     
16     return 0;
17 }

1、3つのルールは硬い要求ではありませんが、大きなメリットをもたらすことができます.
   
8、まとめ:
1,汎用プログラミングの思想はクラスに応用できる.
2、クラステンプレートは同じ方法で異なるタイプのデータを処理する.
3、クラステンプレートはデータ構造に関するコードを書くのに非常に適している.
4、クラステンプレートは使用時に指定したタイプしか表示できません.
転載先:https://www.cnblogs.com/dishengAndziyu/p/10918688.html