函数模板与类模板的详解

1.函数模板的性质
1) 函数模板并不是真正的函数,它只是C++编译生成具体函数的一个模子。
2) 函数模板本身并不生成函数,实际生成的函数是替换函数模板的那个函数,比如上例中的add(sum1,sum2),
    这种替换是编译期就绑定的。
3) 函数模板不是只编译一份满足多重需要,而是为每一种替换它的函数编译一份。
4) 函数模板不可以设置默认模板实参。比如template 不可以。

5) 函数模板不允许自动类型转换。

(6)模板的类型不固定,想是什么类型就可以是什么类型,具体是什么类型,执行的时候才知道。

(7)还要看执行的时候逻辑是否会出错,比如模板的功能是比大小,但传进去的参数确是类,所以就不可以。

C++模版函数的语法
template 

函数返回类型 函数名(形参列表…)

template    //T1为   所创建模板的类型

T1 m(T1 X,T1 y)

{

      return (x只要能调用<运算的都可以用这个模板,具体到的数据类型在执行的时候才生效!

}

//在这里调用对象做参数就是错的,因为对象不可以进行<运算。

calss Stu{.........}

Stu stu1,   Stu stu2

Stu stu=m(stu1,stu2);

//下面的就是对的!

int main()

{

     int n1=2;

     int n2=10;

     int i=m(n1,n2);   //在用模板的时候,n1和n2类型要相同,返回的类型也要相同,是int全都是int,是float全都是float

     cout<<"i"<

     return 0;

}

类模板:在类中使用了模板类型

             构造函数用模板的时候要这样写  MyClass<T1,T2>::MyClass(T1 a,T2 b)

具体例子如下:

#ifndef LEIBOBAN_H
#define LEIBOBAN_H
#include
using namespace std;
 
  
template <typename T1,typename T2>  //模板类的定义在声明文件中,其他文件重复引用该头文件时不会出错
class leiboban
{
public:
    T1 I;
    T2 J;
    leiboban(T1 a,T2 b)
    {
        void show();
        /*
        void show2()
        {
            cout<<"I="<I<<",j="<J<
 
  
        }
        */
 
  
    }
};
//构造函数
template<typename T1,typename T2>   //每写一个用该模板类的函数时都要加上声明
MyClass<T1,T2>::MyClass(T1 a,T2 b){            //模板函数是这样定义的
    this->I=a;
    this->J=b;
}
//void show();
template<typename T1,typename T2>
void leiboban<T1,T2>::show()
{
    cout<<"I="<<this->I<<",J="<<this->J< 
  
}
#endif // LEIBOBAN_H
 
  


你可能感兴趣的:(C++)