1. 程式人生 > >C++面試總結(三)模板與泛型程式設計

C++面試總結(三)模板與泛型程式設計

1.什麼是模板?

   泛型程式設計是指獨立與任何型別的方式編寫程式碼。泛型程式設計和麵向物件程式設計,都依賴與某種形式的多型。面向物件程式設計的多型性在執行時應用於存在繼承關係的類,一段程式碼可以可以忽略基類和派生類之間的差異。在泛型程式設計中,編寫的程式碼可以用作多種型別的物件。面向物件程式設計所依賴的多型性稱為執行時多型性,泛型程式設計所依賴的多型性稱為編譯時多型性或靜態的多型性。

1)C++提供兩種模板機制:函式模板類模板

2)類屬 —— 型別引數化,又稱引數模板

使得程式(演算法)可以從邏輯功能上抽象,把被處理的物件(資料)型別作為引數傳遞。

總結:

  • 模板把函式或類要處理的資料型別引數化,表現為引數的多型性,稱為類屬。
  • 模板用於表達邏輯結構相同,但具體資料元素型別不同的資料物件的通用行為。

 2.函式模板

//函式模板宣告
template <型別形式引數表>
型別 函式名(形式引數表)
{
    語句序列
}

3.函式模板實現機制?

編譯器並不是把函式模板處理成能夠處理任意類的函式

編譯器從函式模板通過具體型別產生不同的函式

編譯器會對函式模板進行兩次編譯:

    在宣告的地方對模板程式碼本身進行編譯;在呼叫的地方對引數替換後的程式碼進行編譯。

4.類模板

//類模板由模板說明和類說明構成
template <型別形式引數表>
類宣告

//例如
template<typename Type>
class TClass
{
    //TClass的成員函式
    private:
        Type DataMember;
};

5.類模板的優點? 
(1)可用來建立動態增長和減小的資料結構 (2)它是型別無關的,因此具有很高的可複用性。 (3)它在編譯時而不是執行時檢查資料型別,保證了型別安全 (4)它是平臺無關的,可移植性 (5)可用於基本資料型別

6.實現自己的vector

myvector.h

#ifndef MYVECTOR_H
#define MYVECTOR_H

#include <iostream>

using namespace std;

template <typename T>
class MyVector
{
	friend ostream& operator<< <T>(ostream &out, const MyVector<T>& 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 <iostream>
#include "MyVector.h"
using namespace std;

//注意:這邊與宣告時不同
template <typename T>
ostream& operator<<(ostream &out, const MyVector<T>& obj)
{
	for (int i = 0; i < obj.m_len; i++)
	{
		out << obj.m_space[i] << " ";
	}
	out << endl;
	return out;
}
template <typename T>
MyVector<T>::MyVector(int size)
{
	m_space = new T[size];
	m_len = size;
}


template <typename T>
MyVector<T>::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 <typename T>
MyVector<T>::~MyVector()
{
	if (m_space != NULL)
	{
		delete[] m_space;
		m_space = NULL;
		m_len = 0;
	}
}

template <typename T>
T& MyVector<T>::operator[] (int index)
{
	return m_space[index];
}

template <typename T>
MyVector<T>& MyVector<T>::operator=(const MyVector<T>& 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;

}