zoukankan      html  css  js  c++  java
  • C++的模板类和函数模板

    一.模板类(和类模板一样?)

    先看一个正确的例子

    #include <iostream>
    using namespace std;
    
    template <class T>
    class MyType {
    public:
        MyType(){t=0;}
        MyType (T ta){t=ta;}
        T getValue();
        MyType operator+(MyType mt1){
            MyType mt;
            mt.t=t+mt1.t;
            return mt;}
    private:
        T t;
    };
    
    template <class T>
    T MyType<T>::getValue()
    {
        return t;
    }
    
    int main()
    {
        MyType<int> s1(10),s2(-5),s3;
        MyType<double> s4(10.3),s5(5.2),s6;
        s3=s1+(s2);
        s6=s4+(s5);
        cout<<"s1.getValue="<<s1.getValue()<<",s2.getValue="<<s2.getValue()<<",s3.getValue="<<s3.getValue()<<endl;
        cout<<"s4.getValue="<<s4.getValue()<<",s5.getValue="<<s5.getValue()<<",s6.getValue="<<s6.getValue()<<endl;
        system("pause");
        return 0;
    
    }

    还有一个正确的例子

    #include <iostream>
    using namespace std;
    
    template <class T>
    class A {
    public:
        A();
        A(T _a,T _b);
        T sum();
    private:
        T a;
        T b;
    };
    
    template<class T>
    A<T>::A(){a=0;b=0;}
    
    template<class T>
    A<T>::A(T _a,T _b){a=_a;b=_b;}
    
    template<class T>
    T A<T>::sum(){return (a+b);}
    
    void main()
    {
        A <int> ai(3,4);
        A<double> ad(3.1,4.0);
        cout<<ai.sum()<<" "<<ad.sum()<<endl;
    }

    注意区分返回值或者参数值等何时为T,合适为类名(例1是MyType,例2是A)比如我常犯的错

    例1中的

    MyType operator+(MyType mt1){
            MyType mt;
            mt.t=t+mt1.t;
            return mt;}

    我常会搞混

    T operator+(T t1){return (t+t1);}

    理论上、语法上也对着,但是main函数中我需要这样调用的

    s3=s1+s2;

    二.函数模板
    在函数中为了针对不同类型数据实现相同功能,通常可能会采用函数重载的功能来实现。例如实现找出两个数中较大的数

    //函数1.
    
    int max(int x,int y);
    {return(x>y)?x:y ;}
    
    //函数2.
    float max( float x,float y){
    return (x>y)? x:y ;}
    
    //函数3.
    double max(double x,double y)
    {return (c>y)? x:y ;}

    这样的方法比较冗余而且局限,定义了几种就只能用这几个类型。

    引入模板函数

    函数模板的一般形式如下:

    Template <class或者也可以用typename T>

    返回类型 函数名(形参表)
    {//
    函数定义体 }

    说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.

    例如:

     

    #include <iostream>
    
    using std::cout;
    
    using std::endl;
    
    
    //声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,
    
    //T可以被任何字母或者数字代替。
    
    template <class T>
    
    T min(T x,T y)
    
    { return(x<y)?x:y;}
    
    
    void main( )
    
    {
    
         int n1=2,n2=10;
    
         double d1=1.5,d2=5.6;
    
         cout<< "较小整数:"<<min(n1,n2)<<endl;
    
         cout<< "较小实数:"<<min(d1,d2)<<endl;
    
         system("PAUSE");
    
    }

     

    三 非类型模版参数

    一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。

    那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。

     

    template<typename T, int MAXSIZE>

    class Stack{
    Private:
    T elems[MAXSIZE]; … }; Int main() { Stack
    <int, 20> int20Stack; Stack<int, 40> int40Stack; … };

     

     

     

     

  • 相关阅读:
    使用VisualStudio进行单元测试之二
    使用VisualStudio进行单元测试之一
    ExtJS监听键盘事件:回车键实现登录功能
    PPTP无法连网
    Android深度探索.
    Android深度探索
    Android驱动开发
    window.open()的具体使用方法
    js控制的几种页面跳转和传值(转载)
    Hatching shader
  • 原文地址:https://www.cnblogs.com/Yogurshine/p/2857843.html
Copyright © 2011-2022 走看看