C++ const static inline用法;static ,静态方法用法?inline,在什么阶段展开函数,编译还是运行编译的过程,编译完成什么内容
const修饰变量、参数、返回值: 在C++中const修饰变量,变量会变成常量,所以声明的同时必须初始化。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。
static修饰局部变量,会改变局部变量的生命周期, 但是不改变作用域。static修饰的全局变量,会对全局变量进行内部链接 指定,即全局变量只能在本文件中使用。
函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?
最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。
解决方案:
因此C++ 中引入了static,用它来修饰变量,它能够指示编译器将此变量在程序的静态存储区分配空间保存,这样即实现了目的,又使得此变量的存取范围不变。
内联函数: 以inline修饰的函数,在编译时会在调用内联函数的地方展开,没有函数压栈的开销,提高程序运行效率。inline只是对编译器的一个建议,编译器会自动去优化。inline必须和函数定义放在一起才有作用,放在声明前不起 作用。定义在类内的成员函数默认是内联函数。编译是将高级语言编译成汇编语言。
什么是虚函数和纯虚函数?
定义一个函数为虚函数,不代表函数为不被实现的函数。
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。(实现多态有个必要条件就是被调用的函数必须是虚函数,且完成了虚函数的重写)
定义一个函数为纯虚函数,才代表函数没有被实现。
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
什么是多态?
C++中 的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术 可以让父类的指针有“多种形态”,这是一种泛型技术。
虚函数表,一个派生类自己定义了一个虚函数,是否出现在它的虚函数表里面?
1、 每一个类都有虚函数列表。
2、 虚表可以继承,如果子类没有重写虚函数,那么子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。如果基类3个虚函数,那么基类的虚表中就有三项(虚函数地址),派生类也会有虚表,至少有三项,如果重写了相应的虚函数,那么虚表中的地址就会改变,指向自身的虚函数实现。如果派生类有自己的虚函数,那么虚表中就会添加该项。
3、 派生类的虚表中虚函数地址的排列顺序和基类的虚表中虚函数地址排列顺序相同,子类独有的虚函数放在后面。
New和malloc的区别?
使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。
c++中引入new,因为对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。所以,需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete.
构造函数和析构函数能不能是虚函数,原因?
构造函数不能是虚函数因为:
1. 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,所以会产生错误
2.虚函数依赖于虚函数表,而虚函数表是在运行期间产生的,而在构造对象期间,虚函数表还没有被初 始化,将无法进行。虚函数的意思就是开启动态绑定,程序会根据对象的动态类型来选择要调用的方法。然而在构造函数运行的时候,这个对象的动态类型还不完整,没有办法确定它到底是什么类型,故构造函数不能动态绑定。
析构函数设为虚函数,因为:
1.在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。
C++内存管理有哪些区,各区作用
在C++中,程序在内存中的存储被分为五个区:
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局/静态区(static):全局变量和静态变量的存储是 放在一块的,在程序编译时分配
4、文字常量区:存放常量字符串
5、程序代码区:存放函数体(类的成员函数、全局函数) 的二进制代码
智能指针,智能指针的释放,底层是如何实现的?
智能指针它是一个类,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放)。通过“引用计数”的方法,有点像硬链接。
B+树的特点
- 所有的叶子结点使用链表相连,便于区间查找和遍历。B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。
- b+树的中间节点不保存数据,能容纳更多节点元素。
- n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
- 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接(叶子节点组成一个链表)。