2020春招字节跳动二面

1. new和malloc的区别
2. c++11新特性

编程实现shared_ptr;

3.模板实例化和特化
  1. 实例化:通过用具体值代替模板中的参数,从而产生普通类,函数或者成员函数的过程。

    隐式实例化:Add(a,c),a的类型是int,c的类型是int。

    显式实例化:Add (a,c)

  2. 特化:

    1. 函数的模板特化

      使用模板时会遇到一些特殊的类型需要特殊处理,不能直接使用当前的模板函数,所以此时我们就需要对该类型特化出一个模板函数(就是写出一个模板函数专门给该类型使用)。

      注意:

      使用模板特化时,必须要先有基础的模板函数(就是上面第一个模板函数)

      使用特换模板函数时格式有要求:

      1. template 后直接跟<> 里面不用写类型
      2. 函数名<特化类型>(特化类型 参数1, 特化类型 参数2 , …) 在函数名后跟<>其中写要特化的类型
      3. 特化的函数的函数名,参数列表要和原基础的模板函数想相同,避免不必要的错误
    template<> // 此处不添加类型模板,直接使用空即可
    bool Isequal<char*>(char*& p1, char*& p2){
    	return strcmp(p1, p2) == 0;
    }
    
    1. 类模板特化

      1. 全特化:

        template <class T1, class T2>
        class Test{
        }
        
        //全特化
        template <>  //此处同函数模板的特化一样不用写内容
        class Test<int , char>{
            
        }
        
      2. 偏特化:(迭代器萃取技术)

        1. 部分特化:

          template <class T1, class T2>
          class Test2{
          }
          
          //部分特化
          template <class T1>  //此处只需写未进行特化的模板类型,特化过的就不用写
          class Test2<T1 , char>{//第二个参数类型,只接受char类型,第一个类型不变
              
          }
          
        2. 限制模板类型:

          template <class T1, class T2>
          class Test2{
          }
          
          //对模板类型的范围做出一定的限制
          template <class T1 , class T2 >  //此处只需写未进行特化的模板类型
          class Test2<T1* , T2*>{//只接受T1和T2类型的指针
          }
          
  3. 优先选择:有特殊到一般,当一个调用一个模板类,首先,找显式实例化的,如果不匹配;接着,找特化的,然后,找偏特化的,最后,根据模板隐式实例化 。对于模板函数,先找参数完全匹配的普通函数(非由模板实例化得到的函数)。再找参数完全匹配的模板函数。再找实参经过自动类型转换后能够匹配的普通函数。

    如果上面的都找不到,则报错。

  4. 模板参数:

4. 动态绑定和静态绑定

动态绑定发生在运行时,静态绑定发生在编译时。

class B
{
    void DoSomething();
    virtual void vfun();
}
class D : public B
{
    void DoSomething();
    virtual void vfun();
}
D* pD = new D();
B* pB = pD;
//静态绑定
pB -> DoSomething();
pD -> DoSomething();
//动态绑定
pB->vfun();
pD->vfun();

猜你喜欢

转载自www.cnblogs.com/hang-shao/p/12743652.html