C++ 面试 制霸之路

核心思想

  • 面试官面试成本
  • 换位思考,面试目的
  • 主动出击

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值