zoukankan      html  css  js  c++  java
  • CVTE一面总结

    1、struct与class的区别

    答:struct默认的访问控制是public,class默认的访问控制是private;还有一点就是定义模版参数时,class作为一个关键字,类似于typename的作用。

    2、常见的智能指针有哪些

    答:primer上提到了三种,shared_ptr、unique_ptr和weak_ptr。其中shared_ptr允许多个指针指向对象,而unique_ptr是独占的指向对象;weak_ptr它指向shared_ptr所管理的对象,但不控制所指向对象的生存期,也就是说不会改变share_ptr的引用计数。

    3、new与malloc的区别

    答:首先是操作的对象不同:malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数,于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 

    然后是用法的不同:malloc返回的是void*类型,所以molloc的时候显示进行类型转换,malloc本身也不识别内存类型,因而需指定转换的内存的总字节数;

    函数原型:void* malloc(size_t size);

    例如申请一块长度为20的int类型的内存,程序如下

    int *p=(int*)malloc(sizeof(int)*20);

    new则内置了sizeof,类型转换与类型安全检查功能,因而不需要进行类型转换和指定内存大小,同时new在创建的同时也可以同时完成初始化工作。

    函数原型:void free(void *memblock);

    例如同样申请长度20的int类型的内存,程序如下

    int *p=new int[20];    //删除时用delete []p;

    申请内存,同时初始化

    int *p=new int(12);

    4、new的实现

    答:这里首先要区分new operator、operator new和placement new

    new operator就是new的操作符,不可以被重载,我们是使用new这个操作符的时候就是new operator,

    但当我们new一个对象时,会分为两步,第一步通过operater new分配足够的空间,第二步调用相关对象的构造函数。

    operator new 负责分配要求的空间,不调用相关的构造函数,可以被重载。

    C* p=new C; //new为new operator,它将调用类C的operator new,为该类分配空间,然后再调用当前实例的构造函数。

    placement new 只是operator new重载的一个版本,并不分配内存,只是返回指向已经分配好的某段内存的一个指针。因此不能删除它,但需要调用对象的析构函数。

    使用它一般分为五步:提前分配缓存,对象分配,使用,对象的析构,释放。

    因而这里所说的new的实现应该指的是operator new的实现,底层仍然是malloc来实现内存的分配的。

    5、vector内存的扩展是怎么实现

    答:vector支持快速随机访问也支持内存空间的扩容,但vector在添加新元素空间不足,重新分配一段更大的内存空间,将就旧空间的原来的元素移到新空间再添加新的元素,释放旧的存储空间。vector本身提供了管理容量的成员函数:

    std::vector<T> c;

    c.size();c.capacity();c.reserve(100);

    size是当前容器已保存的元素个数,capacity是不分配新的空间的前提下最多可以保存多少元素,reserve预先分配一个指定大小的内存(只可以比原来的大,如果参数值小于原来的内存大小则不变化)

    6、单例模式如何实现

    答:单例模式的定义:保证一个类仅有一个实例,并且提供一个访问它的全局访问点。下面是一个简单的实现:

     1 class Singleton
     2 {
     3 private:
     4     static Singleton* instance;
     5     Singleton(){};
     6 public:
     7     static Singleton* GetInstance()
     8     {
     9         return instance;
    10     }
    11 };
    12 
    13 Singleton* Singleton::instance = new Singleton();

    7、STL有哪些组件,认识仿函数吗

    答:容器、算法、迭代器、仿函数、适配器和分配器。

    仿函数行为类似于函数,从实现的角度来看就是一种重载了operator()的class或class template。

    8、重载有什么特点

    答:重载是一个类实现相同的机理,但是操作对象不同。主要特点是定义在同一类中,函数名相同,但参数列表不同,与返回值和virtual无关,与成员函数是否是const有关。

    9、写一个比较两个数大小的template

    1 template<class T>
    2 const T compete(const T &a,const T &b)
    3 {
    4     if(a>=b)
    5         return a;
    6     else
    7         return b;
    8 }

    10、一个空类有什么

    答:

    1 class Empty {};//定义一个空类,类似定义下面这些
    2 class Empty {
    3 public:
    4     Empty(){…}
    5     Empty(const Empty& rhs){…}
    6     ~Empty(){…}
    7     Empty& operator=(const Empty& rhs){…}
    8 };

    11、一个函数名后接一个const指代什么,怎么改变

    答:一个const的成员函数,const修饰是this*指针也就是说,在函数中成员变量是const的,如果要修改可以用关键字mutable修饰成员变量。

    12、求N以内的的所有质数

    答:

     1 vector<int> prime(int N)
     2 {
     3     vector<int> a;
     4     if(N>=2)
     5     {
     6         a.push.back(2);
     7         for(int i=2;i<=n;i++)
     8         {
     9             for(int j=2;j<i;j++)
    10             {
    11                 if(i%j==0)
    12                     break;
    13                 if(j==i-1)
    14                     a.push_back(i);
    15             }
    16 
    17         }
    18     }
    19     return a;
    20 }
    21     

    13、在一个类里定义一个static成员函数与普通函数的区别

    答:static成员函数只能被定义一次,同类的所有对象共享,也就是说一个类中只有一个实例,它代表的是类的一种行为与对象实例无关。

  • 相关阅读:
    Shell脚本创建Nginx的upstream及location配置文件
    系统初始化
    算法训练 P0505
    算法训练 素因子去重
    基础训练 时间转换
    基础训练 字符串对比
    基础训练 分解质因数
    基础训练 矩形面积交
    快速幂矩阵
    基础训练 矩阵乘法
  • 原文地址:https://www.cnblogs.com/kiplove/p/6663877.html
Copyright © 2011-2022 走看看