文章目录
-
- C/C++
-
-
- C++11新特性
- 宏定义交换两个不确定类型的变量
- extern关键字的作用
- 在C++ 程序中调用被 C编译器编译后的函数,为什么被包含 extern "C"?
- 头文件卫士的作用
- C中全局变量 局部变量能同名吗? 如果同名怎么访问全局变量
- sizeof与strlen的区别
- struct的作用
- 访问类的私有成员时,友元类和该类的get和set函数哪一个更好
- socketTCP协议服务器端的编程模型,用到哪些函数
- select函数
- 前置声明,解决头文件重复包含的问题
- 在抽象类中,如果想增加一个接口,把该接口定义在所有接口之前会有什么问题
- C++中三种继承方式的子类对父类三种成员的访问权限
- 虚函数和纯虚函数的区别
- C和C++中static有什么作用,分别描述一下
- printf是从左到右打印还是从右到左打印
- vector自动扩容是如何实现的
- if(n\==10)和if(10\==n)哪一种更好,为什么
- 宏定义如何换行,如何连接字符
- float x与“零值”进行比较,为什么使用了0.000001而不是使用0(整型)
- 中数组名a和&a的区别
- 多态的原理
- 你知道排序算法有哪些吗
- 什么是多态?
- 有了malloc和free为什么用new/delete(我写的是这两个的区别)
- id[sizeof(unsigned long)]这种写法是正确的吗?为什么?
- 指针和引用的区别
- C++中有哪些传参方法
- C++中struct和class区别
- 描述一下重载,隐藏,覆盖
- 有用过二级指针吗?对二级指针有什么理解?
- const和static关键字怎么加,加上去有什么作用? 全局函数加上static有什么用?
- c语言中字符串拷贝函数除了strcpy还有什么拷贝函数?
- 在C++中指针与引用有什么相同点和不同点?
- 面向对象的三个基本特征是什么,并简单叙述之。
- 内存对齐的规则
- 内存对齐的优点和与内存不对齐的区别
- const与指针
- 什么是指针函数与函数指针
- volatile的用法
- char arr[1024\*1024\*4];是否合理合法,如何修改
- ++i/i++的区别 是否是原子操作
- 强制类型转换
- 构造和析构函数可以是虚函数吗
-
- 数据结构和算法
- UC
-
-
- 用一段代码来判断机器是16位的还是32位的?
- 编译过程
- 使用过gdb吗
- 用户态和内核态是什么,什么时候进入内核态
- 进程和线程之间哪些数据是共享的
- 如何保证对共享资源的操作为原子操作?
- 静态库和共享库的区别
- 进程间通信有哪几种方式?各有什么特点?
- 知道共享内存吗?说一下原理?有用过吗?
- 用过多线程吗?怎么样防止多个线程同时访问?
- 死锁产生的条件
- 避免死锁的方法
- 为什么用到线程
- linux下的命名知道哪些
- 打开文件的函数是什么?
- 进程映像:
- 栈和堆的空间区别,为什么用堆?
- 你会遇到内存泄漏吗?
- 用什么分配内存,重复释放是什么结果
- 两个线程访问一个变量有什么问题
- 有哪几种锁
- Makefile
- 高速缓冲区的作用
-
- Qt
- 网络
- 数据库
C/C++
C++11新特性
右值引用: 调用移动构造函数,减少不必要的拷贝
- 资源窃取
- std::move() 语义转换,将参数转换为右值引用类型
- 利用即将结束生命周期的右值的资源,从而避免临时对象的销毁和拷贝
- 完美转发
- std::forward() 保持参数的左右值属性,
- 模板编程时将参数转发给其他函数
智能指针
- shared_ptr
- 内部维护引用计数,到0自动销毁
- 可复制和赋值
- 可自定义销毁方法
- unique_ptr
- 无法赋值和复制,无引用计数,用于资源独占
- 生命周期结束自动调用delete释放
- 支持
std::move()
移动语义转移资源- 可自定义销毁方法
- weak_ptr
- 和shared_ptr结合使用,解决shared_ptr相互引用问题
lambda表达式
- 匿名函数
- 在做安卓开发的时候经常用java里的lambda表达式,java中和c++的区别是java无捕获变量的操作,而是直接可以访问所有外部变量
nullptr
- 解决重载函数匹配问题
宏定义交换两个不确定类型的变量
#define swap(a,b) {a = a ^ b; b = b ^ a; a = a ^ b;}
extern关键字的作用
- 声明在其他文件中定义的外部变量或函数
- C++中
extern C
告诉编译器使用C的标准编译代码
在C++ 程序中调用被 C编译器编译后的函数,为什么被包含 extern “C”?
因为c++中调用同名函数要考虑函数重载,要对函数类型进行声明
头文件卫士的作用
- 防止头文件重复包含
C中全局变量 局部变量能同名吗? 如果同名怎么访问全局变量
可以同名,局部变量会屏蔽全局变量,C中无法再在该作用域访问全局变量,C++可以使用域限定符访问全局变量
sizeof与strlen的区别
sizeof
计算的是实际所占的内存空间的大小strlen
计算的是字符串的长度,到'\0'
截止,且不包括
struct的作用
- 把不同的变量整合到一起,方便数据的管理
- 使多个数据的存储位置连续,把多个数据封装成一个数据包,方便写入文件和网络传送
访问类的私有成员时,友元类和该类的get和set函数哪一个更好
get和set函数,因为使用友元会破坏类的封装性,安全性
socketTCP协议服务器端的编程模型,用到哪些函数
socket,bind,listen,acctep,read,write,recv,send
select函数
前置声明,解决头文件重复包含的问题
- 前置声明只是告诉编译器这是一个类型,但是无法得知类型的大小,成员,是一种不完整的声明
- 如果一个文件中只需要用到另一个文件中的类类型的指针或应用,或者用于声明该类型作为形参或返回值类型,只需对该类型进行前置声明,而不需要include,提高编译效率
在抽象类中,如果想增加一个接口,把该接口定义在所有接口之前会有什么问题
C++中三种继承方式的子类对父类三种成员的访问权限
父类成员 内部 子类 外部 友元 子类对象(public) 子类对象(protected) 子类对象(private) public ✔ ✔ ✔ ✔ ✔ ✘ ✘ protected ✔ ✔ ✘ ✔ ✘ ✘ ✘ private ✔ ✘ ✘ ✔ ✘ ✘ ✘
父类成员 public继承的子类 protected继承的子类 private继承的子类 public public protected private protected protected protected private private 不可直接访问 不可直接访问 不可直接访问
虚函数和纯虚函数的区别
- 含有纯虚函数的类被称为抽象类,一般用来定义接口,无法实例化
- 虚函数必须实现,可以直接使用,或被子类覆盖,而纯虚函数在基类中只有声明没有定义,必须在子类中实现才能使用
- 都可在子类中被重载,以多态形式被调用,是一种运行时的多态(重载:编译时多态)
C和C++中static有什么作用,分别描述一下
- C++中static修饰成员变量: 使变量属于整个类而不是某个对象
- C++中static修饰成员函数: 函数失去this指针,只能访问static成员,使函数属于整个类
- 修饰局部变量: 作用域不变,延长生命周期为全局(整个程序),只初始化一次(默认初始化为0)
- 修饰函数: 限制作用域为本文件
printf是从左到右打印还是从右到左打印
从右往左计算,从左往右输出
vector自动扩容是如何实现的
内部预置容量大于等于元素数量
当前容器容量无法容纳元素时重新申请更大内存并复制
不同编译器实现扩容方式不同,GCC按2倍扩容
capacity()查看当前可容纳的元素数量
reserve()设置预留元素个数
if(n==10)和if(10==n)哪一种更好,为什么
第二种更好,因为第一种如果少写了一个’=’,则if语句括号中就变成了赋值语句n=10,而这样写能通过编译,编译器无法检测到错误,用第二种写法,若是少些一个’=’,则if语句中就变成了10=n,在C/C++的语法中并没有这样的语法存在,因此无法通过编译,编译器可以直接检测到错误。用第二种写法可以有效降低bug的出现率,是一种良好的编程风格
宏定义如何换行,如何连接字符
反斜杠
\
换行
##
连接字符(串)
float x与“零值”进行比较,为什么使用了0.000001而不是使用0(整型)
中数组名a和&a的区别
- a表示数组中第一个元素的地址,
- &a表示整个数组的地址,两者在数值上相同,但对两者+1运算后a+1指向数组第二个元素,&a+1指向整个数组末尾的下一个地址(下一个数组的地址)
多态的原理
在C++类中,一旦成员函数中有虚函数,这个类中就会多一个虚函数表指针,这个指针指向一个虚函数表,表里记录了这个类中所有的虚函数,当这个类被继承,它的子类中也会有一个虚函数表(不管子类中有没有虚函数),如果子类的成员函数中有函数签名与父类的虚函数一样就会用子类中的函数替换它,在虚函数表中的位置,这样就达到了覆盖的效果。当通过类指针或应用调用函数时,会根据对象中实际的虚函数表记录来调用函数,这样就达到了多态的效果
你知道排序算法有哪些吗
冒泡,选择,插入,快速,归并,堆
什么是多态?
- 运行时多态: 当子类覆盖了父类的虚函数时,通过父类指针指向子类对象时,调用虚函数,会