赞
踩
使用函数模板 实现一个函数就可以起到上面三个函数才能起到的作用
当数据类型是int时,编译器生成一个函数,其形参类型都是int
当数据类型时double时,编译器生成一个函数,其形参类型都是double
在写入template<typename T>这句代码时可以生成多个参数
其函数模板的格式是template<typename T1, typename T2>
编译通过实参的类型,推出函数中的数据类型,生成对应的函数,这个过程叫模板实例化
下面两个函数模板中的函数名称可以相同
自定义类型的函数名也可以和函数模板的名称相同
- template<class T>
- T Add(const T& left, const T& right)
- {
- return left + right;
- }
-
- template<class T1, class T2>
- T1 Add(T1 left, T2 right)
- {
- return left + right;
- }
-
- int Add(const int& left, const int& right)
- {
- return left + right;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- //类模板
- template<class T>
- class Stack
- {
- public:
- void Push(const T& x)
- {}
- private:
- T* _a;
- int _top;
- int _capacity;
- };
- int main()
- {
- int a1 = 10, a2 = 20;
- double d1 = 10.111, d2 = 20.111;
- //1. 如果调用的是具有模板的函数,编译器将会根据传入的数据去推演形参的类型
- //2. 如果像下面这种方式进行函数调用,可以称之为显示实例化
- // 那么编译器会直接将形参理解为<>中的数据类型
- cout << Add<double>(a1, a2) << endl;
- cout << Add<int>(d1, d2) << endl;
-
- // 下面第一行代码会调用模板T1 Add(T1 left, T2 right)
- // 第二行代码会调用int Add(const int& left, const int& right)
- // (如果模板和int Add(const int& left, const int& right)同时存在,
- // 由于调用int Add(const int& left, const int& right)需要类型转换
- // 所以会实例化模板
- // 第三行会直接通过显示实例化调用模板
- // 总结:显示实例化 > 参数类型匹配的自定义函数 > 模板 > 参数不匹配需要强转的自定义函数
- cout << Add(a1, a2) << endl;
- cout << Add(d1, d2) << endl;
- cout << Add<double>(a1, a2) << endl;
-
- //使用类模板,生成两个不同的栈类,不同之处在于存放的数据类型不同
- Stack<int> st1;
- Stack<double> st2;
-
- return 0;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
10 C++中使用模板类的原因
10.1 模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构
10.2 模板最重要的一点就是类型无关,提高了代码复用性
10.3 只要支持模板语法,模板的代码就是可移植的
注意:模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换
13 模板声明的几种方式
13.1 template<class T1,class T2>
13.2template<typename T1,typename T2>
13.3template<class T1,typename T2>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。