【C++】模版的概念、使用方法和深入了解

原创 2016年05月30日 15:04:09

    模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。模板分为模板函数和模板类。

    模板函数

假设现在要实现一个比较两个数是否相等的重载函数。

bool IsEqual (int left, int right)
{
     return left == right;
}

bool IsEqual (const string& left , const string& right)
{
     return left == right;
}

void test1 ()
{
     string s1 ("s1"), s2("s2");
     cout<<IsEqual (s1, s2)<<endl;
     cout<<IsEqual (1,1)<<endl;
}

    从代码可以看出,如果我们要比较int和char类型需要分别编写程序来解决这两个问题,所以代码的重复度就会很高,所以C++中就引入了模版来解决这个问题。

    模板形参的定义既可以使用class,也可以使用typename,含义是相同的。上面的问题就可以简化为如下的代码:

template<class T>
bool IsEqual(const T& left, const T& right)
{
    return left == right;
}

void test1 ()
{
     string s1 ("s1"), s2("s2" );
     cout<<IsEqual (s1, s2)<<endl ;
     cout<<IsEqual (1,1)<<endl;
}

对于T的类型,编译器自己会通过推演得到T的类型,从而做出应有的处理。


    在这,重点分享下模版的深入知识。

template<typename T>
class SeqList
{
public:
    SeqList()
        :_array(NULL)
        , _size(0)
        , _capacity(0)
    {}
    
    ~SeqList()
    {
        if (_array)
        {
            delete[] _array;
        }
    }

    SeqList(const SeqList<T>& s)
    {
        _array = new T[s._size];
        //memcpy(_array, s._array, sizeof(T)*s._size);

        for (size_t i = 0; i < s._size; i++)//根据size的大小来,原空间多大,同样拷贝多大的空间
        {
            _array[i] = s._array[i];
        }

        _size = s._size;
        _capacity = s._capacity;
    }

    SeqList<T>& operator=(SeqList<T> s)
    {
        swap(_array, s._array);
        swap(_size, s._size);
        swap(_capacity, s._capacity);

        return *this;
    }

    void PushBack(const T& x)
    {
        _CheckCapacity();
        _array[_size++] = x;
    }

    void Print()
    {
        for (int i = 0; i < _size; ++i)
        {
            cout << _array[i] << " ";
        }
        cout << endl;
    }

    void Reserve(size_t x)
    {
        _CheckCapacity(x);
    }

    T& operator[](size_t index)
    {
        assert(index < _size);

        return _array[index];//如果不用引用,那么传过来的是一块临时空间,只是将临时空间的值给覆盖了,如果使用引用那么就是把对应的空间给出来,赋值的时候直接在原基础上改动
    }
    
protected:
    void _CheckCapacity(size_t n)
    {
        if (n > _capacity)
        {
            _capacity = 2 * _capacity + 3 > n ? 2 * _capacity + 3 : n;
            /*_array = (T*)realloc(_array, sizeof(T)*_capacity);*/

            T* tmp = new T[_capacity];
            if (_array)
                /*memcpy(tmp, _array, sizeof(T)*_size);*/ 
            for (size_t i = 0; i < _size; i++)
            {
                tmp[i] = _array[i];
            }

            delete[] _array;
            _array = tmp;
        }
    }

private:
    T* _array;
    size_t _size;
    size_t _capacity;
};

//template<typename T>  //在模版内声明,在模版外定义与C++代码写顺序表的区别
//void SeqList<T>::PushBack(const T& x)//作用域要写类型名,而不是类名
//{
//    
//}

void test1()
{
    SeqList<int>s1;
    s1.PushBack(1);
    s1.PushBack(2);
    s1.PushBack(3);
    s1.PushBack(4);

    s1.Print();

    SeqList<string> s2;
    s2.PushBack("xxx");
    s2.PushBack("xxx");
    s2.PushBack("xxx");
    s2.PushBack("xxx");
    s2.PushBack("xxx");

    s2.Print();

    SeqList<string> s3(s2);
    s3.Print();

    SeqList<string> s4;
    s4.PushBack("yyy");

    s4 = s3;
    s4.Print();
    //string* p1 = (string*)malloc(sizeof(string));//指向的是字符串类,字符串类里面不仅仅只包含了字符串指针,还有_size,_capacity等内容
    //string* p2 = new string;

    //*p1 = "sss";
    //*p2 = "sss";

}

int main()
{
    test1();
    system("pause");
    return 0;
}


本文出自 “滴水” 博客,请务必保留此出处http://10740329.blog.51cto.com/10730329/1750293

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

c++模版的一些使用方法(一)

在一个项目中,我认为c++模版的主要应用是对一些基础组件的封装。因为基础组件往往是供上层开发人员使用的,并且它一般具有不确定性和支持的旷阔性,stl的容器是个很好的例子。容器支持n中类型,这表现了它的...

c++模版的一些使用方法(三)

c++模版的应用是可以分类的。按照用途,可以分为:   1)工程模版   2)算法和数据结构的解耦   3)工作于编译期的模版   4)XX的封装   5)适配器模式 首先解释一下,这里的...

C++使用方法

  • 2014年11月11日 14:33
  • 815KB
  • 下载

CSS z-index 属性的使用方法和层级树的概念

转 http://www.neoease.com/css-z-index-property-and-layering-tree/ CSS 中的 z-index 属性用于设置节点的堆叠顺...

C++中Static的使用方法

  • 2012年11月19日 10:23
  • 96KB
  • 下载

Visual C++6.0使用方法

  • 2012年04月24日 23:26
  • 443KB
  • 下载

CSS z-index 属性的使用方法和层级树的概念

CSS 中的 z-index 属性用于设置节点的堆叠顺序, 拥有更高堆叠顺序的节点将显示在堆叠顺序较低的节点前面, 这是我们对 z-index 属性普遍的认识. 与此同时, 我们总是对堆叠顺序捉摸不透...

C++6.0使用方法!

  • 2013年10月23日 17:14
  • 774KB
  • 下载

c++对sqllite的使用方法

  • 2012年10月17日 21:40
  • 278KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++】模版的概念、使用方法和深入了解
举报原因:
原因补充:

(最多只允许输入30个字)