zoukankan      html  css  js  c++  java
  • c++的函数模板和类模板

    函数模板和普通函数区别结论:

    函数模板不允许自动类型转化

    普通函数能够进行自动类型转换

    函数模板和普通函数在一起,调用规则:

    1 函数模板可以像普通函数一样被重载

    2 C++编译器优先考虑普通函数

    3 如果函数模板可以产生一个更好的匹配,那么选择模板

    4 可以通过空模板实参列表的语法限定编译器只通过模板匹配

    template<typename T>
    void func(T x)
    {
        cout << "func的值是:" << x << endl;
    }
    
    template<typename T>
    T func(T x, T y)
    {
        cout << "func2的值是:x " << x << ",y的值是:" << y << endl;
        return x > y ? x : y;
    }
    
    int func(int x, int y)
    {
        cout << "func3的值是:x " << x << ",y的值是:" << y << endl;
        return x > y ? x : y;
    }
    
    void func(int x)
    {
        cout << "func4的值是" << x << endl;
    }
    
    int main()
    {
        func(12);  //优先使用普通函数
        func<>(12);  //空模板,限定使用模板函数
        func(12.34,100.56);  //没有对应的函数,则会使用适合的模板函数
        cout << func('a', 10) << endl;   //普通函数中可以进行类型转换,模板函数严格匹配
        system("pause");
        return 0;
    }

    函数模板机制结论

    编译器并不是把函数模板处理成能够处理任意类的函数

    编译器从函数模板通过具体类型产生不同的函数

    编译器会对函数模板进行两次编译

    在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。

    二、类模板

    继承中的类模板语法

     子类从模板类继承的时候,需要让编译器知道 父类的数据类型具体是什么(数据类型的本质:固定大小内存块的别名)如:

    class B : public A<int>

    用类模板定义对象时用以下形式:

        类模板名<实际类型名> 对象名;

        类模板名<实际类型名> 对象名(实参表列);

    如:

        Compare<int> cmp;

        Compare<int> cmp(3,7);

    类模板中的static关键字

    1.从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员

    2.和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化

    3.每个模板类有自己的类模板的static数据成员副本

    所有容器提供的都是值(value)语意,而非引用(reference)语意。容器执行插入元素的操作时,内部实施拷贝动作。所以STL容器内存储的元素必须能够被拷贝(必须提供拷贝构造函数)。

  • 相关阅读:
    live2d 快速实现好看的看板娘特效
    JQuery 日期转换日期方法封装
    SQL Server 之 DateTime的常用方法
    C# 之DateDiff 时间差扩展方法
    SQL Server 之如何查询某数据库下的触发器和语句
    Css 设置固定表格头部,内容可滚动
    jquery 点击tr选中checkbox,解决checkbox的默认点击事件被阻止的问题
    VS切换代码自动补全模式
    C#实现软键盘的几个关键技术介绍
    C# 模拟软件键盘输入,使Winfrom窗体不获取鼠标焦点方法
  • 原文地址:https://www.cnblogs.com/phpzhou/p/5642819.html
Copyright © 2011-2022 走看看