C++技术点积累(5)——泛型编程(函数模板、类模板)

          模板是C++类型参数化的多态工具。C++提供函数模板和类模板。模板定义以模板说明开始。类属参数必须在模板定义中至少出现一次。同一个类属参数可以用于多个模板。类属参数可用于函数的参数类型、返回类型和声明函数中的变量。模板由编译器根据实际数据类型实例化,生成可执行代码。实例化的函数。模板称为模板函数;实例化的类模板称为模板类。函数模板可以用多种方式重载。类模板可以在类层次中使用 。

1、函数模板——本质:类型参数化

  1)使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。
      总结:
             模板把函数或类要处理的数据类型参数化,表现为参数的多态性,称为类属。
             模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为。

// 函数的业务逻辑 一样 
// 函数的参数类型 不一样
// 让 类型参数化 ===, 方便程序员进行编码
// 泛型编程 
// template 告诉C++编译器 我要开始泛型编程了。看到T, 不要随便报错
template <typename T>
void myswap(T &a, T &b)   //标准库为我们定义了一个模板化的swap函数,可以用std::swap使用。我们自定义的,就不要再使用swap
{
	T c = 0;
	c = a;
	a = b;
	b = c;
	cout << "hello ....我是模板函数 欢迎 calll 我" << endl;
}

// 函数模板的调用
// 显示类型 调用
// 自动类型 推导
void main()
{
		
	int x = 10; 
	int y = 20;

	//myswap<int>(x, y); //1 函数模板 显示类型 调用
	myswap(x, y);  //2 自动类型 推导
	printf("x:%d y:%d \n", x, y);
}

        注意:普通函数可以进行隐式的类型转化,而函数模板将严格的按照类型惊醒匹配,不会进行任何自动类型转换。当函数模板和普通函数都符合调用时,优先选择普通函数;如果 函数模板产生更好的匹配 使用函数模板。

2)C++编译器模板机制剖析
      编译器并不是把函数模板处理成能够处理任意类的函数;编译器从函数模板通过具体类型产生不同的函数;编译器会对函数模板进行两次编译;在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译

2、类模板

         类模板在表示如数组、表、图等数据结构显得特别重要,这些数据结构的表示和算法不受所包含的元素类型的影响。

       编写类模板代码,在编写成员函数时和以往稍有不同,注意几点:

           A.  如果类模板的成员函数较简单,直接在类里面实现;(原因往后看)

           B.  如果成员函数的实现写在类外(写在同一.h文件中),要注意友元函数的编写operator<< <T>,你可能不清楚怎么回事,请去看该文章最后的代码MyVector中<<运算符的重载,此外还有:

                      BA.  模板头:template <typename T>  ——每个成员函数必须全部单独

                      BB.  成员函数 的 参数列表 类型具体化——XXXXX<T>::  

                      BC.  成员函数 的 返回值类型 类型具体化——XXXXX<T>::  

                      BD.  成员函数 的 类作用域具体化——XXXXX<T>::  。

           C. 为什么我前面建议在编写类模板代码时那么建议?——简单不容易出错!</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值