C++面试题库
1.C++11新特性
1.1 类型推导
- auto:用于推导变量类型;
- decltype:用于推导表达式类型;
// 两者均在编译器执行类型推导
auto a = 1;
const int& b = 2;
decltype(b) c = 3;
1.2 左值-右值
- 左值:可以取地址,放在等式左边的;
- 右值:不能取地址,不能放在等号左边的;
- 左值引用:对左值进行引用类型
- 右值引用:对右值进行引用类型
- 移动语义:主要用于转移变量的资源所有权,将原始的资源归为己用,原来的变量被销毁
- 完美转发:std::forward,目标函数和转发函数类型一致
int a = 1; // a是左值
int b = a + 1; // b+1的返回值以及1字符型常量,均为右值
int& c = a; // 左值引用
int&& d = std::move(a); // 通过std:move将左值a转换为右值,从而使用右值引用
std::forward<int&>(a); // 完美转发,a是左值引用类型
1.3 列表初始化
直接对变量使用列表初始化值,包括基本数据类型、数组、STL
float a{10.2};
int b[2] = {1, 2};
std::vector<int> c{1, 3 ,6};
1.4 lambda表达式 && std::function && std::bind
- lanbda表达式:匿名函数
auto func = [capture] (params) -> ret { func_body; }; - std::function:函数对象
- std::bind:绑定可调用对象和参数
// 1.lamdba表达式,
// []不捕获任何变量;
// [&]引用捕获,捕获外部作用域所有变量,在函数体内当作引用使用;
// [=]值捕获,捕获外部作用域所有变量,在函数内内有个副本使用
// [a]只值捕获a变量,不捕获其它变量
// [this]捕获当前类中的this指针
vector<int> nums{2, 6, 3, 8};
auto sort_nums = [](int a, int b) -> bool {return a > b;}
std::sort(nums.begin(), nums.end(), sort_nums);
// 2.function函数
void print_nums(int a) {
std::cout << "a: " << a << std::endl;
}
std::function<void(int)> fun = print_nums; // function调用函数对象
fun(12);
// 3.std::bind函数
double callableFunc (double x, double y) {return x/y;}
auto NewCallable = std::bind (callableFunc, std::placeholders::_1,2);
std::cout << NewCallable (10) << '\n'; // 相当于调用NewCallable(10, 2),因为其中2被绑定