面试

37 阅读3分钟

一、c++11/14/17

1. 什么是auto关键字?它的推导规则是什么?C++14 对auto有哪些扩展?decltypeauto的区别是什么?它的推导规则是什么?

auto:c++11类型推倒关键字,让编译器根据变量的初始化表达式自动推导其类型 decltype:c++11类型推倒关键字,获取表达式的精确类型,不执行表达式

auto c++11针对变量,c++14支持了函数返回值和lambla表达式(实现了泛型lambla,auto sum=[auto a,auto b]{return a+b; })

decltype:c++14支持decltype(auto),主要用于函数返回值推导,确保返回值类型与表达式完全一致(避免auto的类型截断):

decltype(auto) get(int& x){return x;}//返回int&,若用auto,返回int

auto:

  • 默认移除顶层const/volatile
const int a = 10;
auto x = a;(x是int)
const auto x = a;(x是const int),需显示加const才保留
  • 默认推倒为非引用
int &a = 10;
auto x = a;(a是int,而非int&)
auto &x = a;需显示加&才保留

decltype:

  • 若表达式是变量名 / 类成员访问,推倒变量为精确类型,顶层const/volatile不移除
const int a = 10;
decltype(a) x = a;//a 是const int
  • 若表达式是左值表达式,推倒为引用,若表达式是右值表达式,推倒为表达式类型
int a = 10;
decltype(a) x = a;//x是int&

decltype(10+20) x=3;//x是int

2.说说智能指针?unique_ptr为什么不能拷贝?shared_ptr的循环引用问题如何解决?shared_ptr的底层结构?

确保唯一的所有权,若允许拷贝,会导致多个unique_ptr指向同一内存,析构时重复释放.

包含两个指针:1)指向管理对象的 “数据指针”;2)指向 “控制块” 的指针(控制块存储引用计数、弱引用计数、析构器等)。

3 什么是 lambda 表达式?它的语法结构、捕获方式、 mutable 关键字的作用是什么?C++14/17 有哪些扩展?

按值捕获的变量默认是const(lambda 是const成员函数),加mutable后可修改捕获的变量(但修改仅在 lambda 内部生效,不影响外部变量):

4.C++11 的nullptrNULL的区别是什么?为什么推荐用nullptr

用于替代 C 风格的NULL,解决NULL的类型歧义问题.NULL的本质是0(或void*),在函数重载、模板推导时会导致类型混淆;nullptr,无歧义(仅匹配指针类型)

5.C++11 的constexprconst的区别是什么?

对比维度constconstexpr
核心语义运行时常量(只读,值可能运行时确定)编译期常量(值必须在编译期确定)
适用场景修饰变量(只读)、函数(不可修改成员)修饰变量(编译期确定)、函数(编译期执行)
内存占用可能存储在内存中(运行时访问)通常存储在编译期常量区(无运行时开销)
函数返回值运行时确定编译期确定(可用于模板参数)

c++17 支持constexpr if(编译期条件判断,不满足的分支会被编译器丢弃,实现 “编译期分支”);

6.什么是移动语义(Move Semantics)?std::move的作用是什么?它会触发对象的移动构造吗?

7.

8.

9.

10.

11.