• 20240425,模板


    感觉比学C那会好了点,不怎么出现照着抄但是就是不能跑的情况,哭死,但是学的顺又不复习,第二天跟没学一样,笑死,要是能给我开个过目不忘的挂,爽的不要不要的
    呵呵呵蠢女人,别忘了你C++的作业没做,C的坑还没补

    目录

    模板

    0.1 函数模板

    开局BUG:提示对重载函数的调用不明确,是一开始图简单,三个函数名写成了 SWAPINT , SWAPDOUBLE , 模板函数是SWAP改成SWAP(A,B)没用,模板函数名改成MYSWAP报错消失​编辑

     正确

    0.1.1 注意事项

    0.1.2 函数模板案例——数组排序

     0.1.3 普通函数和函数模板的区别

    0.1.4  普通函数和函数模板的调用规则

    0.1.5 模板局限性

    模板

    C++另一种编程思想为泛型编程,主要利用的技术就是模板
    两种机制:函数模板,类模板

    0.1 函数模板

    作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表
    语法:template < typename T>,函数声明或定义
    template--声明创建模板;typename--表明其后面的符号是一种数据类型,可以用CLASS代替;T--通用的数据类型,名称可以替换,通常为大写字母

    开局BUG:提示对重载函数的调用不明确,是一开始图简单,三个函数名写成了 SWAPINT , SWAPDOUBLE , 模板函数是SWAP
    改成SWAP(A,B)没用,模板函数名改成MYSWAP报错消失
    1. #include<iostream>
    2. using namespace std;
    3. void swapint(int& a, int& b) {
    4. int temp = a;
    5. a = b;
    6. b = temp;
    7. }
    8. void swapdouble(double& a, double& b) {
    9. double temp = a;
    10. a = b;
    11. b = temp;
    12. }
    13. //声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用的数据类型
    14. template <typename T>
    15. void swap(T &a, T &b) {
    16. T t= a;
    17. a = b;
    18. b = t;
    19. }
    20. void test01() {
    21. int a = 10; int b = 30;
    22. swapint(a, b);
    23. cout << a << "\t" << b << endl;
    24. double c = 4.333; double d = 231.21;
    25. swapdouble(c, d);
    26. cout << c << "\t" << d << endl;
    27. swap(a, b);
    28. cout << a << "\t" << b << endl;
    29. }
    30. int main()
    31. {
    32. test01();
    33. system("pause");
    34. return 0;
    35. }
     正确
    1. #include<iostream>
    2. using namespace std;
    3. void swapint(int& a, int& b) {
    4. int temp = a;
    5. a = b;
    6. b = temp;
    7. }
    8. void swapdouble(double& a, double& b) {
    9. double temp = a;
    10. a = b;
    11. b = temp;
    12. }
    13. //声明一个模板,告诉编译器后面代码中紧跟着的T不要报错,T是一个通用的数据类型
    14. template <typename T>
    15. void myswap(T &a, T &b) {
    16. T t= a;
    17. a = b;
    18. b = t;
    19. }
    20. void test01() {
    21. int a = 10; int b = 30;
    22. swapint(a, b);
    23. cout << a << "\t" << b << endl;
    24. double c = 4.333; double d = 231.21;
    25. swapdouble(c, d);
    26. cout << c << "\t" << d << endl;
    27. //自动类型推导
    28. myswap(a, b);
    29. cout << a << "\t" << b << endl;
    30. myswap(c, d);
    31. cout << c << "\t" << d << endl;
    32. //显示指定类型
    33. myswap<int>(a, b);
    34. cout << a << "\t" << b << endl;
    35. myswap<double>(c, d);
    36. cout << c << "\t" << d << endl;
    37. }
    38. int main()
    39. {
    40. test01();
    41. system("pause");
    42. return 0;
    43. }
    0.1.1 注意事项

     自动类型推导,必须推导出一致的数据类型才可以使用
    模板必须要确定出T的数据类型,才可以使用(可以不调用T,但是要确定类型)

    1. #include<iostream>
    2. using namespace std;
    3. template<class T>
    4. void myswap(T& a, T& b) {
    5. T temp = a;
    6. a = b;
    7. b = temp;
    8. }
    9. template<class T>
    10. void func() {
    11. cout << "function 的函数调用" << endl;
    12. }
    13. void test01() {
    14. int a = 0; int b = 77;
    15. double c = 43.23;
    16. char d = 'c';
    17. myswap(a, b);
    18. cout << a << "\t" << b << endl;
    19. //myswap(a, c);错误
    20. //func();错误
    21. func<int>();
    22. func<double>();
    23. func<string>();
    24. func<char>();
    25. }
    26. int main()
    27. {
    28. test01();
    29. system("pause");
    30. return 0;
    31. }
    0.1.2 函数模板案例——数组排序

    从大到小,排序算法为选择排序,测试CHAR数组,INT数组
    函数模板使用调用数组参数时,限定的是数组的单元的数据类型……反正就那意思

    1. #include<iostream>
    2. using namespace std;
    3. template<class T>
    4. void func(T arr[], int len) {//只是用T代替不确定的数据类型,嗯,是不确定的
    5. for (int i = 0; i < len; i++) {
    6. int max=i;
    7. for (int j = i+1; j < len; j++) {
    8. if (arr[max] < arr[j]) {
    9. max = j;
    10. }
    11. }
    12. //arr[i] = max;交换,不是简单的赋值,乐
    13. if (i!= max) {
    14. T temp = arr[i];
    15. arr[i] = arr[max];
    16. arr[max] = temp;
    17. }
    18. }
    19. }
    20. void test01() {
    21. char chararr[] = { "fwsfgwegeh" };
    22. int intarr[] = { 2,43,4,5,3,55,2, };
    23. int lenchar = sizeof(chararr) / sizeof(chararr[0]);
    24. int lenint = sizeof(intarr) / sizeof(intarr[0]);
    25. cout << lenchar << " " << lenint << endl;
    26. for (int i = 0; i < lenchar; i++) {
    27. cout << chararr[i] << " ";
    28. }
    29. cout << endl;
    30. for (int i = 0; i < lenint; i++) {
    31. cout << intarr[i] << " ";
    32. }
    33. cout << endl;
    34. func(chararr, lenchar);
    35. for (int i = 0; i < lenchar; i++) {
    36. cout << chararr[i] << " ";
    37. }
    38. cout << endl;
    39. func(intarr, lenint);
    40. for (int i = 0; i < lenint; i++) {
    41. cout << intarr[i] << " ";
    42. }
    43. cout << endl;
    44. }
    45. int main()
    46. {
    47. test01();
    48. system("pause");
    49. return 0;
    50. }
     0.1.3 普通函数和函数模板的区别

    普通函数调用时可以发生自动类型转(隐式类型转换)
    函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
    如果利用显示指定类型的方式,可以发生隐式类型转换
    补:敲代码发现,引用方式接收参数的,都不会发生,暂时时这样的……

    1. #include<iostream>
    2. using namespace std;
    3. int func(int a,int b) {
    4. return a + b;
    5. }
    6. template <class T>
    7. T myadd(T& a, T& b) {
    8. return a + b;
    9. }
    10. template <class T>
    11. T hhmyadd(T a, T b) {
    12. return a + b;
    13. }
    14. void test01() {
    15. int a = 10; int b = 50;
    16. char c = 'a';
    17. cout << func(a, b) << endl;
    18. cout << func(a, c) << endl;//c强制转换成了INT型ACSII码
    19. cout << myadd(a, b) << endl;
    20. //cout << myadd(a, c) << endl;//自动类型推导,不行
    21. //cout << myadd<int>(a, c) << endl;//显示不行
    22. cout << hhmyadd<int>(a, c) << endl;//显示,可以
    23. }
    24. int main()
    25. {
    26. test01();
    27. system("pause");
    28. return 0;
    29. }

     建议使用显示指定类型的方式

    0.1.4  普通函数和函数模板的调用规则

    如果都可以实现,优先调用普通函数
    可以通过 空模板参数列表 来强制调用函数模板
    函数模板也可以发生重载
    如果函数模板可以产生更好的匹配,优先调用函数模板

    1. #include<iostream>
    2. using namespace std;
    3. void func(int a,int b) {
    4. cout << "调用 普通 函数" << endl;
    5. }//如果只给声明,还是调用普通,但是报错
    6. void func(int a, int b,int c) {
    7. cout << "调用 普通chongzai 函数" << endl;
    8. }
    9. template <class T>
    10. void func(T a, T b) {
    11. cout << "调用 模板" << endl;
    12. }
    13. template <class T>
    14. void func(T a, T b,T c) {
    15. cout << "调用 重载 模板" << endl;
    16. }
    17. void test01() {
    18. int a = 10; int b = 50;
    19. int c = 899;
    20. func(a, b);
    21. func<>(a,b);//通过 空模板参数列表 来强制调用函数模板
    22. func(a, b, c);
    23. char c1 = 'a'; char c2 = 'c'; char c3 = 'r';
    24. func(c1, c2, c3);//如果函数模板可以产生更好的匹配,优先调用函数模板
    25. func(a, b, c1);
    26. }
    27. int main()
    28. {
    29. test01();
    30. system("pause");
    31. return 0;
    32. }
    0.1.5 模板局限性

     传入数组-赋值操作,传入类--比较操作;无法正常运行
    解决:模板的重载,可以为特定的(自定义)类型提供具体化的模板;运算符重载【感觉差不多,乐】
    学习模板不是为了写模板,是为了在STL能够运用系统提供的模板

    1. #include<iostream>
    2. #include<string>
    3. using namespace std;
    4. class Person {
    5. public:
    6. string m_name;
    7. int m_age;
    8. Person(string name,int age) {
    9. m_name = name;
    10. m_age = age;
    11. }
    12. };
    13. template<class T>
    14. bool mycompare(T& a, T& b) {
    15. if (a == b) {
    16. return true;
    17. }
    18. else {
    19. return false;
    20. }
    21. }
    22. //为特定的类型提供具体化的模板
    23. template<> bool mycompare(Person& a, Person& b) {
    24. if (a.m_name == b.m_name && a.m_age == b.m_age) {
    25. return true;
    26. }
    27. else {
    28. return false;
    29. }
    30. }
    31. void test01() {
    32. int a = 9; int b = 9;
    33. if (mycompare(a, b)) {
    34. cout << "xiangdeng" << endl;
    35. }
    36. else {
    37. cout << " bu bu bu " << endl;
    38. }
    39. }
    40. void test02() {
    41. Person a("张三",12);
    42. Person b("张三", 12);
    43. if (mycompare(a, b)) {
    44. cout << "xiangdeng" << endl;
    45. }
    46. else {
    47. cout << " bu bu bu " << endl;
    48. }
    49. }
    50. int main()
    51. {
    52. test01();
    53. test02();
    54. system("pause");
    55. return 0;
    56. }
  • 相关阅读:
    注册域名,购买阿里云服务器,备案,域名解析图文教程简介
    MySQL 关键字 IN 与 EXISTS 的使用与区别
    并发编程(三)原子性(2)
    软件与系统安全复习
    请你设计一个LRU(最近最少使用)缓存约束的数据结构
    前端excel写入信息并下载
    QT国际化,语言翻译
    使用boost::hana::int_c的示例程序
    哪种护眼灯孩子用着最好?盘点五款用眼舒适度高的护眼灯
    Java中的mysql——面试题+答案(数据库设计)——第25期
  • 原文地址:https://blog.csdn.net/qq_51583806/article/details/138158597