C++面接総括(三)テンプレートと汎用プログラミング

3071 ワード

1.テンプレートとは?
汎用プログラミングとは、独立して任意のタイプの方法でコードを記述することです.汎用プログラミングとオブジェクト向けプログラミングは,いずれもある形式の多態に依存する.オブジェクト向けプログラミングのマルチステート性は、実行時に継承関係のあるクラスに適用され、コードはベースクラスと派生クラスの違いを無視できます.汎用プログラミングでは、作成されたコードを複数のタイプのオブジェクトとして使用できます.オブジェクト向けプログラミングに依存する多態性を実行時多態性,汎用プログラミングに依存する多態性をコンパイル時多態性または静的多態性と呼ぶ.
1)C++は2種類のテンプレートメカニズムを提供する:関数テンプレート、クラステンプレート
2)類属――類型パラメータ化、パラメータテンプレートとも呼ばれる
プログラム(アルゴリズム)が論理機能から抽象化され,処理されるオブジェクト(データ)タイプをパラメータとして伝達できるようにする.
まとめ:
  • テンプレートは、関数またはクラスが処理するデータ型をパラメータ化し、パラメータの多態性として表現し、クラス属と呼ぶ.
  • テンプレートは、論理構造は同じであるが、特定のデータ要素タイプの異なるデータオブジェクトの一般的な動作を表すために使用される.

  •  2.関数テンプレート
    //      
    template 
          (     )
    {
            
    }

    3.関数テンプレートの実現メカニズム
    コンパイラは,関数テンプレートを任意のクラスを処理できる関数に処理するわけではない.
    コンパイラは関数テンプレートから特定のタイプによって異なる関数を生成します.
    コンパイラは、関数テンプレートを2回コンパイルします.
    宣言された場所でテンプレートコード自体をコンパイルします.呼び出した場所でパラメータ置換後のコードをコンパイルします.
    4.クラステンプレート
    //              
    template 
       
    
    //  
    template
    class TClass
    {
        //TClass     
        private:
            Type DataMember;
    };

    5.クラステンプレートのメリット(1)動的成長および縮小のために使用できるデータ構造(2)タイプに依存しないため、多重性が高い.(3)コンパイル時に実行時ではなくデータ型をチェックし、タイプセキュリティを保証する(4)プラットフォームに依存せず、移植性(5)基本データ型に使用できる
    6.自分のvectorを実現する
    myvector.h
    #ifndef MYVECTOR_H
    #define MYVECTOR_H
    
    #include 
    
    using namespace std;
    
    template 
    class MyVector
    {
    	friend ostream& operator<< (ostream &out, const MyVector& obj);
    public:
    	MyVector(int size = 0);
    	MyVector(const MyVector& obj);
    	~MyVector();
    
    public:
    	int getLen()
    	{
    		return m_len;
    	}
    	T& operator[] (int index);
    	MyVector& operator=(const MyVector& obj);
    
    protected:
    	T *m_space;
    	int m_len;
    
    };
    
    #endif

    myvector.cpp
    #include 
    #include "MyVector.h"
    using namespace std;
    
    //  :        
    template 
    ostream& operator<& obj)
    {
    	for (int i = 0; i < obj.m_len; i++)
    	{
    		out << obj.m_space[i] << " ";
    	}
    	out << endl;
    	return out;
    }
    template 
    MyVector::MyVector(int size)
    {
    	m_space = new T[size];
    	m_len = size;
    }
    
    
    template 
    MyVector::MyVector(const MyVector& obj)
    {
    	m_len = obj.m_len;
    	m_space = new T[m_len];
    
    	for (int i = 0; i < m_len; i++)
    	{
    		m_space[i] = obj.m_space[i];
    	}
    }
    
    
    template 
    MyVector::~MyVector()
    {
    	if (m_space != NULL)
    	{
    		delete[] m_space;
    		m_space = NULL;
    		m_len = 0;
    	}
    }
    
    template 
    T& MyVector::operator[] (int index)
    {
    	return m_space[index];
    }
    
    template 
    MyVector& MyVector::operator=(const MyVector& obj)
    {
    	if (m_space != NULL)
    	{
    		delete[] m_space;
    		m_space = NULL;
    		m_len = 0;
    	}
    	m_len = obj.m_len;
    	m_space = new T[m_space];
    
    	for (int i = 0; i < m_len; i++)
    	{
    		m_space[i] = obj.m_space[i];
    	}
    
    	return *this;
    
    }