面试笔记

文章目录

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++中调用同名函数要考虑函数重载,要对函数类型进行声明

头文件卫士的作用
  1. 防止头文件重复包含
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++类中,一旦成员函数中有虚函数,这个类中就会多一个虚函数表指针,这个指针指向一个虚函数表,表里记录了这个类中所有的虚函数,当这个类被继承,它的子类中也会有一个虚函数表(不管子类中有没有虚函数),如果子类的成员函数中有函数签名与父类的虚函数一样就会用子类中的函数替换它,在虚函数表中的位置,这样就达到了覆盖的效果。当通过类指针或应用调用函数时,会根据对象中实际的虚函数表记录来调用函数,这样就达到了多态的效果

你知道排序算法有哪些吗

冒泡,选择,插入,快速,归并,堆

什么是多态?
  • 运行时多态: 当子类覆盖了父类的虚函数时,通过父类指针指向子类对象时,调用虚函数,会
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值