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++的三個知識點。

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM