C++提高---模板

用{}初始化聚合对象如数组

1)模板

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

  1)函数模板

  1)函数模板

    作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。---提高代码复用性,将类型参数化

    语法:

      template<typename T>

      函数声明或定义

        解释:1)template----声明创建模板变量

             2)typename----表明其后的符号是一种数据类型,可用class代替

             3)T----通用的数据类型,名称可以替换,通常为大写字母

    使用方式:

        1)自动类型推导

          直接将数据传入函数模板的函数中,让编译器自己推导出数据类型-----如mySwap(a, b);

        2)显示指定类型

          用<>指定模板数据类型----如mySwap<int>(a, b);

  2)函数模板注意事项

    自动类型推导使用时----必须推导出一致的数据类型T

    模板必须要确定出T的数据类型,才可以使用-----即模板不能直接使用

  4)函数模板和普通函数的区别

    1)普通函数调用可以发生隐式类型转换

    2)函数模板  ----自动类型推导方式,不可以发生隐式类型转换,编译器自动判断出数据类型,不会自己转换数据类型

             ----显示指定类型方式,可以发生隐式类型转换,编译器直接将数据类型转换成指定的数据类型

  5)普通函数与函数模板的调用规则-----一般要避免重名,了解即可

    1)普通函数和函数模板都可实现,优先掉普通函数

    2)可通过空模板参数列表(即<>)来强制调用空模板

    3)函数模板可以发生重载

    4)若函数模板可以产生更好的匹配,优先调用函数模板---如若调用普通函数需要编译器自己转换数据类型,而函数模板不需要的情况

  3)类模板

      作用:建立一个通用的类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表。

      1)类模板语法

        template<typename T>-----可用class代替typename

        类

      2)类模板与函数模板区别

        1)类模板没有自动类型推导的使用方式

        2)类模板在模板参数列表中可以有默认参数(类型)

      3)类模板中的成员函数创建时机

        ----普通类中的成员函数一开始就可以创建,类模板中的成员函数在调用时才创建

      4)类模板对象做函数参数

          类模板实例化出对象,向函数传参的方式

          传入方式: 1)指定传入的类型-----比较常用,直接显示对象的数据类型

                2)参数模板化----将对象中的参数变为模板进行传递---函数模板中形参为对象中的参数的模板化T

                3)整个类模板化----将此对象类型模板化进行传递---函数模板中形参变为对象的模板化T

      5)类模板与继承

          注意事项:

            1)子类继承的父类是一个类模板时,子类声明时,要指定父类中T的数据类型

            2)若不指定,编译器无法给子类分配内存

            3)若想灵活指定出父类中T的类型,子类也需变为模板

      6)类模板成员函数类外实现

          1)补充template行,让编译器认识模板参数列表T

          2)实现时函数作用域::前补充参数列表<T>----若不加<T>,则只是普通的成员函数类外实现

      7)类模板分文件编写

          之前忘记写的小点:#pragma once----防止头文件重复包含

          常遇到问题:类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到

          两种解决方式:

            1)运行文件中,直接包含.cpp源文件----没道理让人看源文件,一般少用

            2)将声明和实现写到同一个文件中,并改后缀名为.hpp,hpp为约定名称(一看hpp就知道是类模板),并非强制--主流

      8)类模板与友元

          掌握类模板配合友元函数的类内和类外实现

          全局函数类内实现--直接在类内用friend声明友元并实现即可

          全局函数类外实现--提前让编译器知道全局函数的存在---类内声明友元时要加模板参数列表<>,类外要加template让编译器明白

              比较复杂

      

    

  

  

原文地址:https://www.cnblogs.com/MissZhang-154/p/13267660.html