目录
一、C++语言基础
1.C++的3大特性
封装、继承、多态。封装是把函数做成工具类,继承是对基础类功能进行扩充,多态是同一个函数名有不同参数,根据参数使用对应的函数。
2.C和C++的区别
1)C是C++的子集,C++可以兼容C语言,同时又引入了新特性,例如auto、智能指针、引用;
2)C++引入了模板概念;
3.C++的struct和class的区别
1)struct的默认访问控制权限是public,class的默认访问控制权限是private;
2)struct默认公有继承,class默认私有继承;
3)class关键字可以用来定义模板,struct不行
4.C++结构体和C结构体区别
1)可以派生
2)C++结构体可以有函数
3)C++可以省略struct关键词直接用
4)C++的struct包含public、private、proteted三种权限
5.简述C++代码到二进制可执行程序的过程
预编译->编译->汇编->链接
1)把#define,#incude替换掉,去掉注释;
2)把C++代码转成汇编语言;
3)把汇编语言编译;
4)把每个源文件产生的目标文件进行链接;
6.static关键字的作用
7.数组和指针的区别
1)数组地址是连续的,指针是无序的
2)数组占用空间和数组长度有关,指针空间是固定的8bit
8.函数指针
用于函数回调
9.静态变量什么时候初始化
10.野指针产生的原因
释放指针的时候没有置NULL,导致其仍指向有数据的内存;解决方法有:
1)初始化置NULL;
2)申请内存后判空
3)指针释放后置NULL;
4)使用智能指针;
11.静态局部变量、全局变量、局部变量的特点及应用场景
12.内联函数和宏函数的区别
13.i++和++I的区别
i++是先使用i再加1,++i是先加1再使用i
14.new和malloc的区别
15.内联函数和函数的区别
内联函数直接用,函数需要调用
16.C++的传值方式
1)值传递
2)引用传递
3)指针传递
17.const*和*const的区别
1)const int a; //指的是a是一个常量,不允许修改。 2)const int *a; //a指针所指向的内存里的值不变,即(*a)不变 3)int const *a; //同const int *a; 4)int *const a; //a指针所指向的内存地址不变,即a不变 5)const int *const a; //都不变,即(*a)不变,a也不变
二、面向对象
1.构造函数有哪几种
1)默认构造函数
2)初始化构造函数
3)拷贝构造函数
包含深拷贝和浅拷贝,深拷贝是直接重新创建一个,浅拷贝是起了个别名,还是用的原来的
4)移动构造函数
采用浅拷贝,避免一块儿空间被释放多次,也避免了内存浪费
2.一个类,默认会生成哪些函数
1)默认构造函数
2)拷贝函数
3)赋值运算符
4)析构函数
3.简述向上转型和向下转型
1)向上转型,子类转父类,使用dynamic_cast<>(),比较安全,不会丢失数据
2)向下转型,父类转子类,使用强制转型,不安全。
4.重载和重写
重载就是同一个函数名,不同形参;重写就是虚函数,子类的虚函数覆盖父类的。
5.类继承时,派生类对不同关键字修饰的基类方法的访问权限
1)继承public,类内可以访问基类的public、protected,不可以访问private;对象可以访问基类的public,不能访问protected和private。
2)继承protected,类内可以访问基类public、protected,不能访问private;对象不能访问基类的public、protected和private。
3)继承private,类内可以访问基类的public、protected,不能访问private;对象不能访问基类的public、protected和private。
6.什么是常函数,什么作用
常函数就是在函数后面加const,表示这个函数不改变类内的成员数据,它只能调用常函数,不能调用非常函数。
三、其他问题
1.什么是稳定排序
如果a[i]=a[i+1],且a[i]在a[i+1]前面,排序后它俩位置不变,则该排序算法稳定;否则不稳定
稳定的排序算法:冒泡排序、直接插入排序、归并排序
不稳定的排序算法:快速排序、希尔排序、堆排序
2.什么是堆栈溢出
空间不够,放不下。例如申请了一块儿很大的内存空间。
3.如何解决哈希冲突
(1)线性探测法
如果两个值都映射为同一个哈希值,则对第二个+1取余,如果该位置还有数,则继续+1取余
(2)开链法
在重复数字后面,使用链表添加重复的哈希值