-
C++ this指针是干什么用的?
假如一个类型定义了很多对象,类里面有很多定义的私有成员变量,共享一套成员方法。通过this指针这可以区分方法、变量是操作的哪个对象的。 -
C++的new和delete,new[]和delete[]可以混用吗?
一般来说operator new 对应 operator delete
new[] 对应 delete[]ptr ,对于内置类型四者相互混用也行。
但是,如果是自定义类型。而且提供了析构函数,那么用new[] 就一定要用delete[]ptr,不能够混用。
delete相对于free,1.调用析构函数2.释放内存 -
C++的static关键字的作用?
从面向过程角度来说:static可以修饰全局变量,函数,局部变量。
对于static修饰全局变量,函数,添加static关键字后变成只当前文件可见,原因:再符号表中符号的作用域就从global变成了local)
对于static修饰局部变量-变量初始化并且初始化不为0的放在了.data段,没有初始化或者初始化为0的放在了.bss端(局部变量不产生符号,在栈上通过ebp-偏移量来访问的)
从面向对象角度来说:static可以修饰成员变量,成员方法(从私有变成共享)修饰成员方法时不会再生成this指针了,直接通过类作用域调用即可。 -
C++的继承有什么好处?
继承属于类和类之间的关系(除了继承还有组合)
继承是 a kind of关系 一种
组合是 a part of关系 一部分
继承好处:
代码复用
通过继承,在基类里面给所有派生类可以保留统一的纯虚函数接口,等待派生类进行重写,通过使用多态,可以通过基类指针访问不同派生类对象的同名覆盖方法(做到开闭原则) -
讲一下C++ 的继承多态
多态:静态多态和动态多态,静态多态是指编译时期的多态,比如函数重载和模板
动态多态是指运行时期的多态,比如虚函数和通过基类指针/引用指向派生类对象 -
C++ 空间配置器是什么?
空间配置器allocator:给容器使用的,主要作用就是把内存开辟与对象构造分开,把对象析构和内存释放分离开。
分开原因:当我们去初始化一个容器时,底层应该是空的,只有内存,没有对象,但是如 果在容器构造时直接用new,不仅会开辟内存还会构造很多无用的对象 。当容器删除一个元素时不应该进行内存释放(后面可能会继续使用),只用把对象析构掉即可。 -
vector和list的区别?
vector底层数据结构是数组,list底层数据结构是链表。
vector底层内存可以做二倍扩容的数组(内存是连续的),提供了尾部的增加删除操作,时间复杂度都是O(1),适合做随机访问时间复杂度是O(1)(优先级队列是基于vector实现)
list是一个循环的双向链表,适合增加、删除节点,时间复杂度都是O(1)。 -
map和多重map?
map:映射表【key-value】底层是由红黑树实现
multimap:唯一一点不同之处就是允许key重复
红黑树:5个性质(每个节点都要有颜色,根节点必须为黑色,叶子节点必须是黑色,从根节点到每一个叶子节点的路径上,不能出现连续的红色节点,不允许出现两个连续的红色节点)插入的3种方式(最多旋转2次),删除的4种情况(最多旋转3次) -
C++如何防止内存泄漏?智能指针详述?
内存泄漏:分配到堆内存(没有名字,只能用指针来指向)没有释放,也再没有机会去释放了
智能指针有:
auto_ptr/scoped_ptr/unique_ptr
shared_ptr和weak_ptr
(待补充) -
C++如何调用C语言语句?
C和C++生成符号的方式不同,C和C++语言之间的API接口是无法直接调用的
C语言的函数必须扩在extern"C"{}
#ifdef __cplusplus
extern "c"
{
#endif
int sum(int,int); //在C语言下只会根据函数名生成符号,在C++下会根据函数名+参数列表生成符号
#ifdef __cplusplus
}