《前后端面試題
》專欄集合了前后端各個知識模塊的面試題,包括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) |