• 模板初阶(泛型编程、函数模板、类模板)


    1.泛型编程

    如何实现一个通用的交换函数呢?

    1. void Swap(int& left, int& right)
    2. {
    3. int temp = left;
    4. left = right;
    5. right = temp;
    6. }
    7. void Swap(double& left, double& right)
    8. {
    9. double temp = left;
    10. left = right;
    11. right = temp;
    12. }
    13. void Swap(char& left, char& right)
    14. {
    15. char temp = left;
    16. left = right;
    17. right = temp;
    18. }
    19. int main()
    20. {
    21. int i=0,int j=1;
    22. Swap(i,j);
    23. }

    使用函数重载虽然可以实现,但是有几个不好的地方:

    内部的逻辑都是一样的,只是类型不一样。所以就引出模板template

    2.函数模板

    template

    template<typename T>,typename是用来定义模板参数关键字,也可以使用class,切记L不能使用struct代替class

    template

    更改上面的交换函数为:

    template

    void Swap(T& left,T& right )

    {

          T temp=left;

           left=right;

          right=temp;

    }

    int main()
    {
        int i=0,int j=1;
        Swap(i,j); //都是调用Swap函数吗

        double x=1.1,double y=2.2

        Swap(x,y);

        cout<

        cout<

        cout<(1.1,2)<

       cout<(1.1,2)< }

     调用的不是同一个Swap,执行的指令不一样,temp大小都不一样,建立的栈帧大小不一样,一个开4个字节,一个开8个字节

    根据模板走一个实例化,编译器用模板实例化生成对应的Swap函数,                                  

    3.类模板

    用栈举例为什么要用类模板

    typedef int DataType;
    class Stack
    {
    public:
        Stack(size_t n = 4)
        {
            cout << "Stack()" << endl;
            _array = new DataType[capacity];//new不用检查失败,失败抛异常
            top = 0;
            capacity = n;
        }
        ~Stack()
        {
            cout << "~Stack()" << endl;
            delete[] _array;
            _array = nullptr;
            top = capacity = 0;
        }
        void push(DataType x)
        {
            _array[top++] = x;
        }
    private:
        //成员变量
        DataType* _array;
        int top;
        int capacity;
    };
    int main()
    {
        Stack st1;//int
        Stack st2;//double typedef就不能用了
        return 0;
    }

    但是现在有两个栈,一个想存int,一个想存double,typedef就不能用了,所以就用模板 

    template
    class Stack
    {
    public:
        Stack(size_t n = 4)
        {
            cout << "Stack()" << endl;
            _array = new T[capacity];//new不用检查失败,失败抛异常
            top = 0;
            capacity = n;
        }
        ~Stack()
        {
            cout << "~Stack()" << endl;
            delete[] _array;
            _array = nullptr;
            top = capacity = 0;
        }
        void push(const T& x)//不知道T是什么类型,就把const &加上
        {
            _array[top++] = x;
        }
    private:
        T* _array;
        int top;
        int capacity;
    };
    int main()
    {
        Stack st1;//int
        Stack st2;//double
        return 0;
    }

     

  • 相关阅读:
    uniapp轮播图闪烁卡屏解决办法很简单
    信息学奥赛一本通(c++):1001:Hello,World
    【一起来用C++】————(1)类的练习案例(多文件编写)
    Java创建Document对象有哪些方法呢?
    微信公众号密码转换的密钥
    【广度优先搜索-中等】130. 被围绕的区域
    C //例4.6 要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70~84分,C等为60~69分,D等为60分以下。成绩的等级由键盘输入。
    【Android】Debug时禁用主线程ANR限制
    Java ”框架 = 注解 + 反射 + 设计模式“ 之 注解详解
    C#制做一个 winform下的表情选择窗口
  • 原文地址:https://blog.csdn.net/m0_53830389/article/details/138150802