常用的LINUX命令
pwd 返回当前路径
vim (如果你安装了的话)编辑器
cp 复制
find 寻找文件
ls 显示当前目录下的文件
file 用于查看文件的类型
reboot 重启
C++
1.堆区和栈区的区别
栈区由系统自动分配,堆区由程序员控制,堆区可以实现动态申请内存,在C++中常用new,malloc等方式动态申请
2.请讲讲C++中new,malloc的区别
它们都是动态申请内存的方式,通过调用操作系统的api来实现,
new/delete在自由存储区上开辟空间,malloc、free在堆区分配空间。(你说new在堆上也对,因为自由存储区是一个抽象的概念,堆是物理上一块内存。)(下划线后面的是释放命令。)
new比malloc安全:new的返回类型严格与对象匹配,malloc的返回类型是void然后被强制转化为类型对象,没那么安全。
但是malloc比较好扩容,可以用realloc实现,但是new就没有什么直观的方式实现了。
3.请简述在C++中struct与class的区别
struct默认是public继承,class是private继承。
4. 为什么基类函数的析构函数为虚函数
C++支持多态性,这意味着基类指针可以指向派生类对象。
当使用基类指针删除派生类对象时,如果基类的析构函数不是虚函数,将调用基类的析构函数而不是派生类的析构函数,导致派生类特有的资源没有被正确释放,可能会引起内存泄漏或其他资源管理问题。
STL相关
5.讲讲vector容器和list容器的区别
这需要从底层结构上理解,vector的底层是数组,list是双向链表。
所以内存上,vector连续存储,list非连续存储,只是逻辑上连续。所以vector扩容需要使用reserve函数手动扩容,list扩容是自动的。
所以,插入和删除,list在任何位置都是高效的,vector在中间插入或者删除的时候需要移动大量元素,效率没那么高。
同理,底层为数组的vector是支持随机访问的(vec[x])而list(链表)不支持。
6.讲讲迭代器,如果vector增删之后,迭代器是否有效,为什么?
1.任何导致整体重新分配内存的行为(长度自增扩容,清空)会失效。
2.改变了当前指向元素(插入,删除),会失效。
PS:我不理解这个问题的回答意义在哪里,为什么要在钢丝绳上跳舞,现在C++标准都更新这么多次了,任何不安全的操作就应该被避免。
例如,在使用指针时,能用智能指针包裹就不要用比较原始的指针方式。
7.C++如何防止重复包含头文件
(1)使用宏的一些指令让编译器去干活
比较常用的是#pragma once,虽然非标准指令,但是大多数编译器都支持。
标准的:
#ifndef HEADER_FILE
#define HEADER_FILE
// 头文件内容
#endif
(2)
8.讲讲多态
静态多态在编译阶段实现,动态多态是指在运行时实现。
重载:重载是对于同一类中,可以定义多个同名不同参的函数(返回类型无所谓),在编译中就已经实现了。
重写:动态多态。子类中出现和父类名称相同的函数,用子类指针调用的是子类函数,用父类调用的是父类函数,如果用子类指针调用,实现的是子类函数。
9.讲讲引用和指针
引用需要直接赋予初始值,而且一旦赋予不可以更改。指针可以不赋予初始值,默认值为nullptr(NULL)。
引用的操作与原变量一样,不需要特殊的语法。
指针在使用过程中一定要注意野指针,空指针的问题。
10.子类指针可以指向父类对象吗?
不可以,会出现不兼容的问题。
父类指针可以指向子类对象,此时调用该对象默认执行父类对象的成员函数(是指子类有重载的情况下)。