C++ STL和泛型编程学习笔记(一)模板相关Part I
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++ STL和泛型编程学习笔记(一)模板相关Part I,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5590字,纯文字阅读大概需要8分钟。
内容图文
1. 模板介绍
1.1 模板的概念
函数编写时进一步抽象化(编写函数代码原型时不给定具体类型),调用时再给定具体类型,由编译器在编译时再绑定形成代码(编译时根据调用时的实参具体类型推导匹配的原型中模板的本次具体类型),这就是模板。
1 #include <iostream> 2 3 using namespace std; 4 5 template <typename T> 6 void my_swap(T &x, T &y) 7 { 8 T temp = 0; 9 10 temp = x; 11 x = y; 12 y = temp; 13 } 14 15 // void my_swap(int &x, int &y) 16 // { 17 // int temp = 0; 18 19 // temp = x; 20 // x = y; 21 // y = temp; 22 // } 23 24 25 int main(void) 26 { 27 28 double a, b; 29 30 cin >> a >> b; 31 cout << "a = " << a << ", b = " << b << endl; 32 my_swap(a, b); 33 cout << "a = " << a << ", b = " << b << endl; 34 35 return 0; 36 }函数模板写法和普通函数的对比
1.2 模板的作用
用模板来写库函数更好,因为这样的模板库可以在调用库函数时再指定各种数据类型。
1.3 模板使用的小细节
a. 函数模板定义时typename和class效果是一样的,视个人习惯而使用
b. 函数模板中可以有多个typename(class)
1 #include <iostream> 2 3 using namespace std; 4 5 template <class T, class Q> 6 7 T my_add(T x, Q y) 8 { 9 return x + y; 10 } 11 12 int main(void) 13 { 14 double a; 15 int b; 16 17 cin >> a >> b; 18 cout << "a + b = " << my_add(a, b) << endl; 19 20 return 0; 21 } 22 23 /* 24 输入和输出结果: 25 2.113 32 26 a + b = 34.113 27 */多个typename例子
1.4 模板的分类
(1)函数模板
模板类型在函数参数列表中使用(同上面例程的写法)
(2)类模板
模板类型在类中(定义类成员变量,或类成员函数的参数列表)使用
1 #include <iostream> 2 3 using namespace std; 4 5 // class People 6 // { 7 // private: 8 // int age; 9 10 // public: 11 12 // People(){}; 13 // People(int a); 14 15 // void print(int x); 16 // }; 17 18 // People :: People(int a) 19 // { 20 // age = a; 21 // } 22 23 // void People :: print(int x) 24 // { 25 // cout << "x = " << x << ", age = " << age << endl; 26 // } 27 28 // int main(void) 29 // { 30 // People p1(15); 31 32 // p1.print(10); 33 34 35 // return 0; 36 // } 37 #include <string> 38 39 template <typename T> class People 40 { 41 private: 42 int age; 43 44 public: 45 46 People(){}; 47 People(int a); 48 49 void print(T x); 50 }; 51 52 template <typename T> People<T> :: People(int a) 53 { 54 age = a; 55 } 56 57 template <typename T> void People<T> :: print(T x) 58 { 59 cout << "x = " << x << ", age = " << age << endl; 60 } 61 62 int main(void) 63 { 64 65 People<double> p1(15); 66 People<string> p2(100); 67 68 p1.print(1.223); 69 p2.print("Hello cpp!"); 70 71 return 0; 72 } 73 74 /* 75 输出结果: 76 x = 1.223, age = 15 77 x = Hello cpp!, age = 100 78 */单模板参数的类模板与不带模板的对比
类模板使用的小细节:
a. 类模板定义中的成员函数名后要加表示模板参数的标记,如 <T>
b. 类模板定义中的成员函数前名前要加模板的声明,如 template <typename T>, 构造函数和其他成员函数都要加,其他成员函数要加在返回值类型之前
c. 用到的成员函数中参数列表的参数类型要改为模板类型, 如 T
d. 在主函数使用这个类模板时,声明类型的格式为:类名<要用的变量类型> 类变量名, 使用这个类时不要再加模板声明template <typename T>
1.5 多模板参数的类模板
(1)同类型多参数
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 template <typename T> class People 7 { 8 private: 9 int age; 10 11 public: 12 13 People(){}; 14 People(int a); 15 16 void print(T x, T y); 17 }; 18 19 template <typename T> People<T> :: People(int a) 20 { 21 age = a; 22 } 23 24 template <typename T> void People<T> :: print(T x, T y) 25 { 26 cout << "x = " << x << ", y = " << y << ", age = " << age << endl; 27 } 28 29 int main(void) 30 { 31 32 People<string> p1(15); 33 People<float> p2(1000); 34 35 p1.print("Japanese", "Chinese"); 36 p2.print(1.31, 3.14); 37 38 return 0; 39 }同一模板类型多参数
(2)不同类型多参数
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 template <typename T1, typename T2> class People 7 { 8 private: 9 int age; 10 11 public: 12 13 People(){}; 14 People(int a); 15 16 void print(T1 x, T2 y); 17 }; 18 19 template <typename T1, typename T2> People<T1, T2> :: People(int a) 20 { 21 age = a; 22 } 23 24 template <typename T1, typename T2> void People<T1, T2> :: print(T1 x, T2 y) 25 { 26 cout << "x = " << x << ", y = " << y << ", age = " << age << endl; 27 } 28 29 int main(void) 30 { 31 32 People<double, string> p1(15); 33 People<string, int> p2(100); 34 35 p1.print(1.223, "Chinese"); 36 p2.print("Hello cpp!", 618); 37 38 return 0; 39 } 40 41 /* 42 输出结果: 43 x = 1.223, y = Chinese, age = 15 44 x = Hello cpp!, y = 618, age = 100 45 */不同模板类型多参数
(3)成员函数在类内部的模板类
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 template <typename T> class People 7 { 8 private: 9 int age; 10 11 public: 12 13 People(){}; 14 People(int a); 15 16 void print(T x, T y) 17 { 18 cout << "x = " << x << ", y = " << y << ", age = " << age << endl; 19 } 20 }; 21 22 template <typename T> People<T> :: People(int a) 23 { 24 age = a; 25 } 26 27 28 int main(void) 29 { 30 31 People<string> p1(15); 32 People<float> p2(1000); 33 34 p1.print("Japanese", "Chinese"); 35 p2.print(1.31, 3.14); 36 37 return 0; 38 } 39 40 /* 41 输出结果: 42 x = Japanese, y = Chinese, age = 15 43 x = 1.31, y = 3.14, age = 1000 44 */成员函数在类内部的模板类
内容总结
以上是互联网集市为您收集整理的C++ STL和泛型编程学习笔记(一)模板相关Part I全部内容,希望文章能够帮你解决C++ STL和泛型编程学习笔记(一)模板相关Part I所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。