C++面试题及详细答案100道( 31-40 )
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。
文章目录
- 一、本文面试题目录
- 31. 什么是C++中的模板元编程(TMP)?
- 32. 解释C++中的`alignas`和`alignof`操作符。
- 33. 什么是C++中的初始化列表?
- 34. 解释C++中的`decltype`说明符。
- 35. 什么是C++中的范围`for`循环?
- 36. 解释C++中的`std::initializer_list`。
- 37. 什么是C++中的`std::move`?
- 38. 解释C++中的`std::function`。
- 39. 什么是C++中的`std::bind`?
- 40. 解释C++中的内存对齐的重要性。
- 二、100道面试题目录列表
一、本文面试题目录
31. 什么是C++中的模板元编程(TMP)?
答案:
模板元编程利用C++模板在编译期执行计算,将运行时开销转移到编译期。常见用途:
- 编译期计算(如阶乘)。
- 类型检查和转换。
- 代码生成。
示例代码:
// 编译期阶乘计算
template <int N>
struct Factorial {static constexpr int value = N * Factorial<N-1>::value;
};// 特化终止条件
template <>
struct Factorial<0> {static constexpr int value = 1;
};int main() {constexpr int result = Factorial<5>::value; // 编译时计算为120
}
32. 解释C++中的alignas
和alignof
操作符。
答案:
alignof
:返回类型的对齐要求(字节数)。alignas
:指定变量或类型的对齐方式。
示例代码:
struct alignas(16) MyStruct { // 强制对齐到16字节边界char data[10];
};int main() {std::cout << alignof(MyStruct) << std::endl; // 输出16
}
33. 什么是C++中的初始化列表?
答案:
初始化列表用于在构造函数体执行前初始化成员变量,效率更高,特别是对const
或引用类型。
示例代码:
class MyClass {
private:int value;const std::string name;
public:// 使用初始化列表MyClass(int val, const std::string& nm) : value(val), name(nm) {}// 错误:不能在构造函数体内初始化const成员// MyClass(int val, const std::string& nm) {// value = val;// name = nm; // 错误// }
};
34. 解释C++中的decltype
说明符。
答案:
decltype
用于在编译时推导表达式的类型,常用于模板编程和泛型代码。
示例代码:
int func() { return 42; }int main() {decltype(func()) x; // x的类型为int(func返回值的类型)int a = 10;int& b = a;decltype(b) c = a; // c的类型为int&(引用类型)
}
35. 什么是C++中的范围for
循环?
答案:
范围for
循环(C++11引入)提供简洁的语法遍历容器或序列,等价于迭代器遍历。
示例代码:
#include <vector>int main() {std::vector<int> nums = {1, 2, 3, 4};// 只读访问for (int num : nums) {std::cout << num << " ";}// 修改元素(使用引用)for (int& num : nums) {num *= 2;}
}
36. 解释C++中的std::initializer_list
。
答案:
std::initializer_list
允许函数或构造函数接受初始化列表,用于统一的初始化语法。
示例代码:
#include <initializer_list>class MyVector {
private:int* data;size_t size;
public:// 接受初始化列表的构造函数MyVector(std::initializer_list<int> list) : size(list.size()) {data = new int[size];std::copy(list.begin(), list.end(), data);}
};int main() {MyVector vec = {1, 2, 3, 4}; // 使用初始化列表构造
}
37. 什么是C++中的std::move
?
答案:
std::move
用于将左值转换为右值引用,从而触发移动语义,避免不必要的拷贝。
示例代码:
#include <utility>class MyString {
public:MyString(MyString&& other) noexcept { /* 移动构造函数 */ }
};int main() {MyString a;// MyString b = a; // 拷贝构造MyString c = std::move(a); // 移动构造(a变为有效但未指定状态)
}
38. 解释C++中的std::function
。
答案:
std::function
是通用多态函数包装器,可存储、复制和调用任何可调用对象(函数、lambda、成员函数等)。
示例代码:
#include <functional>int add(int a, int b) { return a + b; }struct Adder {int operator()(int a, int b) const { return a + b; }
};int main() {// 存储普通函数std::function<int(int, int)> func1 = add;// 存储lambdastd::function<int(int, int)> func2 = [](int a, int b) { return a + b; };// 存储函数对象std::function<int(int, int)> func3 = Adder();// 调用int result = func1(1, 2); // 结果为3
}
39. 什么是C++中的std::bind
?
答案:
std::bind
用于创建函数对象(绑定器),将可调用对象与其参数绑定,部分应用参数或重排序。
示例代码:
#include <functional>int add(int a, int b) { return a + b; }int main() {// 绑定add函数,固定第一个参数为10auto addTen = std::bind(add, 10, std::placeholders::_1);// 调用绑定的函数int result = addTen(5); // 等价于add(10, 5),结果为15
}
40. 解释C++中的内存对齐的重要性。
答案:
内存对齐要求数据地址是其大小的整数倍,主要影响:
- 性能:未对齐的内存访问可能需要多次读取。
- 兼容性:某些硬件平台强制要求对齐访问。
- 结构体大小:编译器可能插入填充字节以满足对齐要求。
示例代码:
struct Unaligned {char c; // 1字节int i; // 4字节(通常对齐到4字节边界,因此c后填充3字节)
}; // 总大小8字节struct Aligned {int i; // 4字节char c; // 1字节char padding[3]; // 手动填充3字节,使总大小为8字节
};int main() {std::cout << sizeof(Unaligned) << std::endl; // 输出8std::cout << sizeof(Aligned) << std::endl; // 输出8
}
二、100道面试题目录列表
文章序号 | C++面试题100道 |
---|---|
1 | C++面试题及详细答案100道(01-10) |
2 | C++面试题及详细答案100道(11-20) |
3 | C++面试题及详细答案100道(21-30) |
4 | C++面试题及详细答案100道(31-40) |
5 | C++面试题及详细答案100道(41-50) |
6 | C++面试题及详细答案100道(51-60) |
7 | C++面试题及详细答案100道(61-70) |
8 | C++面试题及详细答案100道(71-80) |
9 | C++面试题及详细答案100道(81-90) |
10 | C++面试题及详细答案100道(91-100) |