19模板

从功能来看,有些程序非常相似,只是处理对象(数据)的类型不同

    void sortArray(int b[],int len);

    void sortArray(double b[],int len);

可以考虑提供具有相同逻辑功能的程序,而将数据类型作为参数——类属编程

C++中的模板:类模板和函数模板

好处:

更好的代码重用性

用户使用模板时,编译器替换模板参数(类型)

 

示例

template < class  ElementType >

 void sortArray(ElementType b[],

                int len)

 {for (int pass = 0;

       pass < len - 1; pass ++ )

   for(int i = pass+1; i <= len-1; i++)  

    if ( b[ pass ] > b[ i ] )

    {ElementType hold;

     hold = b[ pass ];                  

     b[ pass ] = b[ i ];

     b[ i ] = hold;

    }

 }

 

 

函数模板

对不同类型的数据执行相似的操作

1.函数重载

2.函数模板

函数重载——代码冗余

1.增加编程负担

2.程序的维护问题(如功能修改,算法变动)

 

函数模板为所有的函数提供唯一的一段函数代码

1.置换代码中的类型参数得到模板函数——实例化

2.函数模板不是函数,不能被执行

3.实例化后的模板函数是真正的函数,可以被执行

 

例子:用类模板实现栈

// tstack.h:  类模板的定义

 template < typename ElementType >

 class Stack

 {public:

   Stack( int = 8 ); // 默认栈元素数目为8

   ~Stack(){ delete [] data; };

   int pop(ElementType &num);  

   int push(ElementType num);  

  private:

   ElementType *data;      //栈数据存储

   int memNum;      //栈元素个数

   int size;      //栈大小

 };

 

 

template < typename ElementType >

 Stack <ElementType>::Stack(int s)

 {size = s > 0 ? s : 8; 

  data = new ElementType[s];

  memNum = 0;

 }

 template < typename ElementType >

 int Stack <ElementType>::pop(

                  ElementType &num)

 {if (memNum==0)

   return 0;

  num = data[ -- memNum ];

  return 1;

 }

 

template < typename ElementType >

 int Stack <ElementType>::push(

                        ElementType mem)

 {if (memNum == size)

   return 0;

  data[ memNum ++ ] = mem;

  return 1;

 }

 

//main.cpp:使用类模板

 #include <iostream.h>

 #include "tstack.h"

 main()

 {Stack <double>  doubleStack(6);

  // Stack <double> 得到模板类

  double f = 3.14;

  cout<<"Pushing elements into

         doubleStack:\n";

  while (doubleStack.push(f))

  {cout << f << ' ';

   f += f;

  }

  cout << "\nStack is full. Cannot push “

       << f << " onto the doubleStack.";

cout<<"\nPopping elements

           from doubleStack:\n";

  while (doubleStack.pop(f))

   cout << f << ' ';

  cout<<"\nStack is empty.Cannot pop.\n"; 

  Stack <int> intStack;//intStack是模板类对象

  int i = 1;

  cout<<"\nPushing elements

         into intStack:\n";

  while (intStack.push(i))

  {cout << i << ' ';

   ++i;

  }

  cout<<"\nStack is full.push "  

      <<i<<"failed.";

  cout<<"\n\nPopping elements

         from intStack:\n";

  while (intStack.pop(i)) 

   cout << i << ' ';

  cout <<

       "\nStack is empty. Cannot pop.\n";

 

  return 0;

 }

 

posted @ 2018-01-09 17:03  gd_沐辰  阅读(232)  评论(0)    收藏  举报