CVTE一面总结

一、struct与class的区别算法

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

二、常见的智能指针有哪些安全

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

三、new与malloc的区别this

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

而后是用法的不一样:malloc返回的是void*类型,因此molloc的时候显示进行类型转换,malloc自己也不识别内存类型,于是需指定转换的内存的总字节数;指针

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

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

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

new则内置了sizeof,类型转换与类型安全检查功能,于是不须要进行类型转换和指定内存大小,同时new在建立的同时也能够同时完成初始化工做。

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

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

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

申请内存,同时初始化

int *p=new int(12);

四、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来实现内存的分配的。

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

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

std::vector<T> c;

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

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

六、单例模式如何实现

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

 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();

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

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

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

八、重载有什么特色

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

九、写一个比较两个数大小的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 }

十、一个空类有什么

答:

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

 

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

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

十二、求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     

 

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

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

相关文章
相关标签/搜索