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成员函数只能被定义一次,同类的所有对象共享,也就是说一个类中只有一个实例,它代表的是类的一种行为与对象实例无关。