zoukankan      html  css  js  c++  java
  • 模板函数与类模板

    C++语言一个重要特性,利用模板机制可以明显减少冗余信息,能大幅度的程序代码。

    (A)函数模板:(instance)

     1 #include<iostream>
     2 using namespace std;
     3 
     4 template<typename ElementType>
     5 
     6 void display(ElementType array[],int numElements)
     7 {
     8     for(int i = 0;i < numElements;i ++)
     9     {
    10         cout<<array[i]<<" ";
    11     }
    12     cout<<endl;
    13 }
    14 
    15 int main()
    16 {
    17     double x[] = {1.1,2.2,3.3,4.4,5.5};
    18     display(x,5);
    19     int num[] = {1,2,3,4};
    20     display(num,4);
    21     return 0;
    22 }

    有多个类型参数的函数模板(instance)

    #include<iostream>
    using namespace std;
    
    template <typename para1,typename para2>
    
    void two_para(para1 x,para2 y)
    {
    	cout<<x<<" "<<y<<endl;
    }
    
    int main()
    {
    	two_para(99,"ZhangHua");
    	two_para(123.45,888);
    	return 0;
    }
    

     函数模板的重载(instance)

    #include <iostream>
    using namespace std;
    
    template <typename type>
    
    type min(type x,type y)
    {
    	return (x < y) ? x : y; 
    }
    
    template <typename type>
    
    type min(type x,type y,type z)
    {
    	type t;
    	t = (x < y) ? x : y;
    	return (t < z) ? t : z;
    }
    
    int main()
    {
    	int m = 10,n = 20,min2;
    	double a = 10.1,b = 20.2,c = 30.3,min3;
    	min2 = min(m,n);
    	min3 = min(a,b,c);
    	cout<<min2<<" "<<min3<<endl;
    	return 0;
    }
    

     当然函数模板也可以和非函数模板进行重载,这里不给出instance了。

    (B)接下来我们讨论一下类模板问题:

    instance:

    #include <iostream>
    using namespace std;
    
    template <typename Type >
    
    class Three
    {
    	public:
    		Three(Type a,Type b,Type c)
    		{
    			x = a;
    			y = b;
    			z = c;
    		}
    		Type sum()
    		{
    			return x + y + z;
    		}
    	private:
    		Type x,y,z;
    };
    
    int main()
    {
    	Three <int> sum1(3,5,7);
    	Three <double> sum2(12.34,34.56,56.78);
    	cout<<sum1.sum() <<" "<<sum2.sum()<<endl;
    	return 0;
    }
    

     instance2:

    #include <iostream>
    using namespace std;
    
    template <typename T>
    
    class Three
    {
    	public:
    		Three(T a,T b,T c);
    		T sum();
    	private:
    		T x,y,z;
    };
    
    template <typename T>
    
    Three<T>::Three(T a,T b,T c)
    {
    	x = a;
    	y = b;
    	z = c;
    }
    
    template <typename T>
    
    T Three<T>::sum()
    {
    	return x + y + z;
    }
    
    int main()
    {
    	Three <int> sum1(3,5,7);
    	Three <double> sum2(12.34,34.56,56.78);
    	cout<<sum1.sum()<<" "<<sum2.sum()<<endl;
    	return 0;
    }
    

     (C)要注意的问题:

    1.template语句与函数模板定义语句之间不能插入其他语句。instance

    template <typename T>
    
    int i;//注意这里不能插入任何其他语句
    
    class Three
    {
    	public:
    		Three(T a,T b,T c);
    		T sum();
    	private:
    		T x,y,z;
    };
    

     2.函数模板与同名非模板函数可以重载,这时调用顺序问题:首先寻找一个参数完全匹配的非模板,如果找到则调用它,若没有找到,则寻找函数模板,将其实例化。

    恰当运用可以很好的处理一般与特殊的关系。还是补充个instance吧:

    #include <iostream>
    using namespace std;
    
    template <typename T>
    
    T min(T x,T y)
    {
        cout<<"调用模板函数:";
        return (x < y) ? x : y;
    }
    
    int min(int x,int y)
    {
        cout<<"调用非模板函数:";
        return (x < y) ? x : y;
    }
    
    int main()
    {
        int elem1 = 10,elem2 = 56;
        double d1 = 50.1,d2 = 5435.23;
        char ch1 = 'k',ch2 = 'n';
        cout<<min(elem1,elem2)<<endl;
        cout<<min(d1,d2)<<endl;
        cout<<min(ch1,ch2)<<endl;
        return 0;
    }

    3.类模板在使用时必须在类模板名字后面加上<类型参数>:

    Three <int> sum1;
    

      

  • 相关阅读:
    存储过程加密
    sql 指删除表,改表名,改字段名
    windows 2003 server 64 位 IIS 6下部署 32位网站
    linux查看内存的使用占比
    linux查看端口是否被占用
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock' (2)
    mysql数据库的备份(mysqldump)和恢复(source)
    linux解压压缩文件zip/tar/tar.gz命令汇总
    oracle数据库的备份和导入数据
    oracle 备份表数据
  • 原文地址:https://www.cnblogs.com/jiaoluo/p/3443763.html
Copyright © 2011-2022 走看看