选择题知识点(一)
一、堆排序相关
1. 建堆时间复杂度: O(n)2. 调整堆、插入、删除: O(log2n)3. 堆排序平均时间复杂度: O(nlog2n)4. 空间复杂度: O(1)
二、排序时间复杂度
三、const 与 volatile const修饰的变量使用指针去修改它的内容
实验一:a是常量无法直接替换,但是通过指针p是可以的,此时a被修改为20
#include<iostream>
using namespace std;
int main(void)
{
const int a = 10;
int* p = (int*)(&a);
*p = 20;
cout << "a = " << a << ", *p = " << *p << endl;
return 0;
}
实验二:使用volatile关键字修饰const
volatile const int a = 10;
结论:最初打印a和*p的内容为10和20,虽然二者共用同一块空间,但是const变量因为编译器优化直接存在了寄存器中,使用时可以提高访问速度,所以即使在内存中修改了变量的值,也没有打印出来。
而使用volatile关键字修饰const,可以让该变量禁止优化,再进行打印就可以体现出来了。
四、空类的大小为1
五、析构函数无限递归
六、析构函数顺序
C c;
void main()
{
A*pa=new A();
B b;
static D d;
delete pa;
}
首先要遵循的特点:先构造的后析构
其次全局对象和静态对象生命周期和程序一致,程序在退出时才会销毁
局部对象是在函数退出时销毁的,遇到delete肯定就调用对应的析构函数
所以,顺序应该先是delete析构A类对象,再析构局部成员对象B类对象b,最后析构D、C静态和全局对象。DC的顺序就按照析构函数最先的特点,先构造的后析构,也就是先析构D、再析构C。
七、对象数组
假定有类 AB ,有相应的构造函数定义,能正确执行AB a ( 4 ), b ( 5 ), c [ 3 ], * p [ 2 ] = { & a , & b };语句,请问执行完此语句后共调用该类的构造函数次数为( ) 5次
a b 分别就是俩个AB类的对象,而用 AB c[3]; 定义了一个大小为3的数组,数组中每个元素为一个AB类对象,至此调用五次构造函数,而后续的p指针数组,里面分别存放了a、b对象的地址,并没有新创建对象。