zoukankan      html  css  js  c++  java
  • C++笔记--模板

    • 一个string模板
      •   简单的定义
         1 template <class C>//模板形式,C是一个类型名字,不一定是某个类的名字
         2 class String{
         3     struct srep;
         4     srep *rep;
         5 public:
         6     String();
         7     String(const C*);
         8     String(const String&);
         9     
        10     C read(int i)const;
        11 };
        String <char > cs;//这些是使用的方法,模板的一些定义
        String <unsigned char> us;
        String <wchar_t>ws;
        class Jchar{
        };
        String <Jchar>js;

        标准库里面有一个base_string模板,很像string模板,所以把前者也是定义为string的同义词:typedef base_string<char>string;

      •   定义一个模板:通常我们是先写一个完整的类,然后再去把它转变为模板类,这样可以避免很多不必要的错误。
        •   定义模板类的成员:不必非得定义在模板类中,可以定义在模板外,但是必须显式的定义他们,他们的参数也是模板化的
          template <class C> struct String<C>::srep{
              C *s;//到元素的指针
              int sz;//元素个数
              int n;//引用计数
          }
          template <class C> C String <C> ::read(int i)const{return rep->s[i];}
        • 通常类模板的名字是不能重载的,如果一个地方定义了一个类模板,它的名字就不能用来去定义一个相同的名字的普通类。


      •   模板实例化:从一个模板类和一个模板参数生成一个类声明的过程;而针对一个特定的模板参数的模板成为专门化。
        •   
          String <char> cs;//这里生成了两个类,cs和js,以及他们的析构和构造函数
          void f(){
              String<Jchar> js;
          }
      • 模板参数:一个模板可以有多个参数,一个模板参数可以定义跟随其后的模板参数。
      •   类型等价,类型检查:与模板参数有关的错误能被检查出来的最早的位置是在:这个模板针对这个参数第一个使用的地方。称为实例化点
    •   函数模板
      •   函数模板的参数:如果不能从模板函数推断出某个模板参数,就只能显示的描述。

      •   函数模板的重载
        •   可以声明同一个名字的多个函数模板。还可以声明同名的函数和函数模板的组合。
          •   
        •   重载解析规则
          •   
    •   用模板参数描述策略
      •   默认模板参数:只有一些不是很平常的比较算法才需显示给出。
    •   模板专门化:
    •   模板和派生:
      •   一个模板类派生出另一个模板类
        •   
          template <class T> class Vector {};
          template <class T>class Vec:public Vector<T>{};
      •      参数化和继承
        •   虚函数提供的东西叫做运行时多态,模板提供的东西叫做编译时多态。(如果在这些对象间不需要某种层次性的东西(从属关系),就用模板;如果在编译时无法确定参数类型,就用抽象继承。
      •   模板类里面的复制赋值函数都必=必须是非模板类的,并且成员模板不能是virtual;
  • 相关阅读:
    Mysql 免密码登录,修改密码及忘记密码操作
    CentOS 6.9 升级MySQL 5.6.36到5.7.18
    【转载】详解布隆过滤器的原理、使用场景和注意事项
    AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion 区别
    为什么要有财务自由【转】
    CacheManager.Core
    雪花算法,生成分布式唯一ID
    监控
    什么是并行、并发, 两者的区别是什么
    Emit用法
  • 原文地址:https://www.cnblogs.com/Kobe10/p/5558469.html
Copyright © 2011-2022 走看看