1.引用和指针的区别
- 指针有自己的地址,其存放的是变量的地址 引用相当于这个变量的别名,实质是引用对象的地址
- 引用在定义时必须初始化,且不能够改变 指针定义时可以不初始化,且其可以改变所指对象 引用不能为NULL
- 对指针++,是访问其下一个地址 对引用++ 是对其引用的对象进行++操作
- 有多级指针,但只有一级引用
- 引用访问为直接访问,指针访问为间接访问
- 引用底层是通过指针实现的
- 传指针实际是值传递,穿的是指针的地址 传引用实质是传地址,穿的是变量的地址
- static 的作用和用法
- static 修饰的变量或函数只能在本程序文件中使用 extern 可声明为可调用 默认为全局可调用
- static 修饰静态变量 类内静态变量为类所共有,类外初始化,先于对象存在 函数内的静态变量放在数据区,只有一个 只一次初始化
- static 静态成员函数 属于类,不为对象所有,只能访问static修饰的类成员
c中静态变量在代码执行之前,编译阶段分配好内存后就会进行初始化
c++ 中初始化在执行相关代码时才会执行 首次使用到时才进行初始化
- extern
- 修饰变量声明 确保其不被隐藏
- 修饰函数声明 确保其不被隐藏
- c++ 中调用C库函数 告诉链接器 使用C函数规范来连接
- 深拷贝与浅拷贝
-
深拷贝拷贝的是值,浅拷贝拷贝的是地址
-
浅拷贝—浅拷贝仅仅是指向被复制的地址,原地址中对象被改变,浅复制出来的对象也会被改变
-
深拷贝—在计算机中开辟新的内存地址用于存放复制的对象
- 虚函数可以声明为inline吗
- 不可以 虚函数运行时类型才确定 而inline函数要求在编译期完成相应的函数替换
- 构造函数的执行顺序 析构函数执行顺序
- 虚基类构造函数 -> 基类构造函数 -> 成员对象的构造函数 -> 派生类自己的构造函数
- 构造函数不能是虚函数,虚函数表存放在对象的内存空间,对象的创建是通过构造函数来创建
- 析构函数要为虚函数是为了防止内存泄漏 删除基类指针指向的派生类对象不触发动态绑定就不会调用派生类的析构函数,派生类中申请的内存空间就得不到释放
虚函数:通过父类指针调用子类成员函数
-
类成员初始化方式
赋值初始化:函数体内初始化 分配内存后初始化
列表初始化:冒号后初始化列表初始化 分配内存时初始化 -
多态
编译时多态(静态):重载函数,模板
运行时多态(动态):函数覆盖,虚函数
9.左值和右值
左值:可以取地址,有名字的是左值
右值:不能取地址,没有名字
左值引用& 右值引用&&
10.移动构造函数和复制构造函数
拷贝构造函数是左值引用,复制对象到新的内存空间,对于指针深拷贝。
移动构造函数是右值引用,直接使用原对象的内存空间,对于指针浅拷贝。
11.C语言编译连接过程
源代码(.c)->预处理(#开头的指令)-> 编译(翻译成中间或者汇编代码.s)-> 汇编(汇编成机器代码)-> 链接(链接其他文件)->可执行文件(.exe)
12.数据结构
vector 底层为数组
list 底层为双向链表
queue
statck
set 红黑树 有序 不重复
multiset红黑树 有序 可重复
map 红黑树 有序 不重复
multimap红黑树 有序 可重复
unordered set hash表 无序 不重复
unordered map hash表 无序 不重复
13.c和c++的区别
c — 面向过程
c++ — 面向对象 new/delete 类 函数重载 引用 多态
- c/c++ 内存分配
栈区(stack) 编译器分配释放,存函数的参数值,局部变量值
堆区(heap) 程序员分配释放,类似于链表
全局区(静态区)(static) 全局变量和静态变量,初始化在一块,未初始化在一块
文字常量区 常量字符串
程序代码区
- 堆和栈的区别
- 栈–编译器管理 堆–程序员管理
- 空间大小 32位系统下 堆可达到4G 而栈很小(1M)
- 堆会造成碎片问题,空间不连续 栈没这个问题
- 分配方式 堆:动态 栈:静态
- 效率 堆比栈慢
- new和malloc区别
new/delete 编译器支持 malloc/free 头文件支持
malloc需要显式指出所需内存的大小
new分配失败后会抛出bad_alloc 异常 malloc 分配失败返回null
new 先operator new 再构造函数 delete 先析构再 operator delete new/delete 可以动态自定义对象
17.内存对齐
分配内存的顺序是按照声明
每个变量相对于起始位置的偏移量必须是该类型大小的整数倍,不是整数倍就空出内存,直到偏移量是整数倍为止
最后整个结构体的大小必须是里面变量类型最大值的整数倍
18.c++类型转换
- static_cast 基础类型转换
- const_cast 去除常量对象的const属性
- reinterpret_cast 指针和整数的转换
- dynamic_cast 指向基类的指针转换为指向子类的指针或引用
19.全局变量和static变量的区别
非静态全局变量作用域是整个源程序(所有源文件)
静态全局变量作用域是定义该变量的源文件
20.explicit 避免隐式类型转换
21.c++异常处理
- 语法错误 编译器处理
- 运行时错误 异常处理机制
异常处理机制 - try(检查) throw(抛出) catch(捕获)
22.sizeof和strlen区别
strlen 计算字符串的具体长度,不包括字符串结束符,返回字符个数
sizeof 计算声明后所占内存大小,不是实际长度
23.操作系统
处理机管理(进程管理)
内存管理
设备管理
文件管理
24.进程和线程的区别
- 统一进程的线程共享本进程的地址空间和资源
- 进程崩溃不会影响其他进程 线程崩溃导致整个进程崩溃
- 进程切换资源消耗大
- 两者均可并发
- 线程不能独立执行
25.进程间通信
管道
FIFO
消息队列
信号量
共享内存
26.虚拟内存
内存管理技术
使程序认为自己拥有一块很大的连续内存