C++Array類模板編寫筆記

C++Array類模板

         函數模板和類模板都屬於泛型技術,利用函數模板和類模板來建立一個具備通用功能的函數和類,以支持多種不一樣的形參,從而進一步簡化重載函數的函數體設計。
數組

        聲明方法:template<typename/class 標識符(T)>函數

        函數聲明(通用形參使用標識符(T)代替)測試

//Array.h
#ifndef ARRAY_H #define ARRAY_H #include<cassert> template<class T>
class Array { private: T* m_list; int m_size; public: //構造函數
    Array(int sz=50); //拷貝構造函數
    Array(const Array<T>&a); //析構函數
    ~Array(); //重載「=」可讓數組對象總體賦值
    Array<T>& operator=(const Array<T>& rhs); //重載「[]」使Array對象能夠索引指定位置數據
    T& operator[](int i); //此處必須返回引用,若返回值,則沒法直接進行運算,變量使用完畢後便被銷燬 //「[]」針對const的重載
    const T& operator[](int i) const; //重載T*類型轉換
    operator T*(); //「T*」針對const的重載
    operator const T*() const; //獲取數組大小
    int getSize() const; //改變數組大小
    void resize(int sz); }; template<class T> Array<T>::Array(int sz) { assert(sz); m_size=sz; m_list=new T[m_size]; } template<class T> Array<T>::Array(const Array<T>& a) { //淺複製
    m_size=a.m_size; m_list=a.m_list; //深複製
    m_size=a.m_size; m_list=new T[m_size]; for (int i = 0; i < m_size; i++) { m_list[i]=a.m_list[i]; } } template<class T> Array<T>::~Array() { delete[] m_list; } template<class T> Array<T>& Array<T>::operator=(const Array<T>& chs) { if (&chs!=this) { if (chs.m_size!=this.m_size) { delete[] m_list; m_size=chs.m_size; m_list=new T[m_size]; } for (int i = 0; i < m_size; i++) { this.m_list[i]=chs.m_list[i]; } } return *this; } template<class T>
//此處引用有兩點:1.不能返回臨時變量,不然引用無值索引;2.此處必須爲引用,若爲值類型,操做數必須爲左值。
T& Array<T>::operator[](int i) { assert(i>=0&&i<m_size); //有待測試
    /*T temp=m_list[i]; return temp;*/
    return m_list[i]; } template<class T> Array<T>::operator T*() { return m_list; } template<class T>
int Array<T>::getSize() const { return m_size; } template<class T>
void Array<T>::resize(int sz) { assert(sz>=0); if (sz==m_size) { return; } else { T* Newlist=new T[sz]; int n=(m_size<sz)?m_size:sz; for (int i = 0; i < n; i++) { Newlist[i]=m_list[i]; } delete[] m_list; m_list=Newlist; m_size=sz; delete[] Newlist; } } #endif

 

           在本次我編寫的Array類模板中,能夠看出類模板的本質仍是函數模板構成的。同時,在這次編寫類模板的過程當中,深入地體會了C++的三個知識點。this

分別是拷貝構造函數的深複製與淺複製成員函數與非成員函數運算符重載返回值與返回引用的區別。接下來,將詳細說這三個知識點。spa

  1. 拷貝構造函數的深複製與淺複製:拷貝構造函數,是以對象的引用做爲形參,並用const常量約束。若對象爲頭指針和線性空間存儲數據的形式,淺複製,則是隻複製了頭指針和空間大小,而未真正意義上實現線性空間的數據複製;而深複製,則將被複制對象的線性空間全部的數據依次賦予對象。
  2. 成員函數運算符重載和非成員函數運算符重載的區別:成員函數在二目運算符中,只須要一個形參,另一個爲本對象的this指針;而非成員函數在二目運算符中,則須要兩個形參。
  3. 返回值與返回引用的區別:返回值,即生成了return變量的拷貝,在使用後,臨時變量就將被銷燬。所以,返回值後不能作左值運算。返回引用,即生成對return變量的別名,可對此變量操做,進行左值運算。但返回引用,返回的不能是臨時變量,必須是類成員變量局部靜態變量傳入的引用形參
相關文章
相關標籤/搜索