C++面試總結(三)模板與泛型程式設計
阿新 • • 發佈:2018-12-25
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;
}