文章目录
核心思想
- 面试官面试成本
- 换位思考,面试目的
- 主动出击
part1:构造、析构->虚函数
1.1 虚函数表是如何构成的
1.2 为什么多态的析构必须是虚函数
1.3 dynamic_cast的原理
part2:C++11新特性 std::move->左值、右值、move、万能引用、完美转发
2.1 定义
2.2 std::move的原理
2.3 万能引用的原理[引用折叠]
2.4 完美转发
2.5 push_back和emphace_back区别
part3:Lamda表达式
3.1 定义
3.2 原理
3.3 本质汇编
part4:面试问遇到的坑
4.0 原子量是如何实现线程安全的
4.1 std::move没有重载
4.2 QString.tostdString()返回的是将亡值
4.3 For循环堆栈
//没有重载std::move 比如指针里面??
// 打印出来为什么不对?
#include <iostream>
#include <memory>
#include <vector>
#include <string>
using namespace std;
class Animal {
public:
Animal(int id_):id(id_) {
std::cout << "构造Animal id = " << id << endl;;
myChar = new char[5];
for (size_t i = 0; i < 5; i++)
{
myChar[i] = static_cast<char>('0' + id_ +i);
}
}
~Animal() {
std::cout << "~构造Animal id = " << id << endl;;
if (myChar != nullptr) delete[] myChar;
}
Animal(const Animal& obj) // 拷贝构造函数
{
std::cout << "拷贝构造函数 id=" << id << endl;;
id = obj.id;
index = obj.index;
myChar = new char[5];
for (size_t i = 0; i < 5; i++)
{
myChar[i] = obj.myChar[i];
}
}
Animal(Animal&& obj) noexcept
{
std::cout << "移动构造函数" << id << endl;;
id = obj.id;
index = obj.index;
myChar = obj.myChar;
//obj.id = -1;
//obj.index = -1;
obj.myChar = nullptr;
}
public:
int id = -1;
int index = -1;
char* myChar = nullptr;
};
int main() {
std::vector<Animal> vectors;
std::vector<int> intV;
for (size_t i = 0; i < 4; i++)
{
Animal obj(i);
vectors.emplace_back(std::move(obj));
}
return 0;
}