面试笔记

文章目录

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

你知道排序算法有哪些吗

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

什么是多态?
  • 运行时多态: 当子类覆盖了父类的虚函数时,通过父类指针指向子类对象时,调用虚函数,会
好的,下面是一些 Spring Boot 面试时可能会涉及的重要知识点和面试建议: 1. 什么是 Spring Boot? Spring Boot 是 Spring 框架的一个子项目,它基于 Spring 框架,简化了 Spring 应用的配置和开发过程,使得开发者可以更加便捷地创建独立、生产级别的 Spring 应用。Spring Boot 提供了自动化配置、开箱即用的组件和快速启动的能力,使得开发者可以更加专注于业务逻辑的实现。 2. Spring Boot 有哪些优点? - 简化了 Spring 应用的配置和开发过程。 - 集成了众多常用的第三方库,可以快速地搭建项目。 - 提供了自动化配置和开箱即用的组件,使得开发者可以更加专注于业务逻辑的实现。 - 与 Spring Framework 完美集成,可以很方便地使用 Spring 的各种功能。 - 支持多种开发方式,包括传统的 WAR 包部署、嵌入式服务器部署、Docker 容器化部署等。 3. Spring Boot 的核心注解有哪些? - @SpringBootApplication:用于标记 Spring Boot 应用的主类,它包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解,可以简化应用的配置和启动过程。 - @Controller、@Service、@Repository、@Component:用于标记 Spring Bean,可以自动扫描并注册到 Spring 容器中。 - @Autowired、@Resource、@Inject:用于依赖注入,可以自动装配 Spring Bean。 4. Spring Boot 的配置文件有哪些? Spring Boot 支持多种配置文件格式,包括 properties、yml、json 等。其中,application.properties 或 application.yml 是 Spring Boot 默认的配置文件,它可以放在项目的 classpath 下,也可以通过指定 spring.config.location 属性来指定配置文件的路径。 5. Spring Boot 的自动配置原理是什么? Spring Boot 的自动配置基于条件注解和条件判断,它会根据应用的上下文环境和 classpath 中的依赖库来自动配置 Spring Bean。例如,当 classpath 中存在 HikariCP 库时,Spring Boot 会自动配置一个 HikariCP 数据源,而不需要手动配置。 6. Spring Boot 如何处理异常? Spring Boot 提供了统一的异常处理机制,可以通过 @ControllerAdvice 和 @ExceptionHandler 注解来处理应用中的异常。在异常处理类中,可以通过 @ExceptionHandler 注解和方法参数来定义需要处理的异常类型和异常处理逻辑。 7. Spring Boot 如何实现 AOP? Spring Boot 集成了 Spring Framework 的 AOP 功能,可以通过 @Aspect 和 @Around 注解来实现切面编程。在切面类中,可以定义需要拦截的方法和拦截逻辑,以实现日志记录、权限控制等功能。 8. Spring Boot 如何实现事务管理? Spring Boot 集成了 Spring Framework 的事务管理功能,可以通过 @Transactional 注解来实现事务控制。在需要进行事务控制的方法上添加 @Transactional 注解,即可开启事务。 9. Spring Boot 如何集成数据库? Spring Boot 支持多种数据库,包括 MySQL、Oracle、MongoDB 等,可以通过在 pom.xml 中添加相应的依赖库来实现数据库的集成。同时,Spring Boot 也提供了多种数据库访问方式,包括 JDBC、JPA、MyBatis 等,可以根据实际需求选择合适的方式。 10. Spring Boot 如何实现缓存? Spring Boot 集成了多种缓存框架,包括 Ehcache、Redis、Caffeine 等,可以通过在 pom.xml 中添加相应的依赖库来实现缓存功能。同时,Spring Boot 也提供了多种缓存注解,包括 @Cacheable、@CachePut、@CacheEvict 等,可以方便地实现缓存功能。 面试建议: - 对于 Spring Boot 的基本原理和使用方法要有深入了解,并能够熟练使用 Spring Boot 搭建项目。 - 对于 Spring Boot 中常用的注解和配置文件要熟练掌握。 - 对于 Spring Boot 中的高级功能(如自动配置、AOP、事务管理、缓存等)要有一定的了解,并能够根据实际需求进行应用。 - 在面试中要注意表达清楚自己的观点和思路,可以通过实际项目经验来证明自己的能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值