ToB企服应用市场:ToB评测及商务社交产业平台

标题: C++秋招冲刺训练营笔记 [打印本页]

作者: 勿忘初心做自己    时间: 2022-9-16 17:19
标题: C++秋招冲刺训练营笔记
顶层const和底层const

变量自身不能改变的是顶层const,比如const int,int *const的常量指针,变量所指的对象或者所引用的对象是不能改变的,而变量自身是可以改变的是底层const,比如const int *的指向常量对象的非常量指针。
左值和右值

左值是有具体存储地址的值,表现为=左边的值,右值是没有具体存储地址,比如寄存器中的值,表现为=右边的值。名字的左值:该名字代表的存储单元的地址;名字的右值:该名字代表的存贮单元的内容。
智能指针
  1. // 初始化方式1
  2. std::unique_ptr<int> up1(new int(1));
  3. std::unique_ptr<int[]> up2(new int[3]);
  4. // 初始化方式2
  5. std::unique_ptr<int> up3;
  6. up3.reset(new int(1));
  7. std::unique_ptr<int[]> up4;
  8. up4.reset(new int[3]);
  9. // 初始化方式3,推荐
  10. std::unique_ptr<int> up5 = std::make_unique<int>(1);
  11. std::unique_ptr<int[]> up6(std::make_unique<int[]>(3));
  12. /* 没有尝试过std::unique_ptr<int> up(std::make_unique<int>(1));
  13. * 和std::unique_ptr<int[]> up = std::make_unique<int[]>(3);是否正确
复制代码
这样获得的up内就包含了指向创建的内存的指针,可以用up.get()来获取该指针,和直接使用up是等价的。
shared_ptr和weak_ptr见cubox收藏,auto_ptr在C++11已经弃用。
模板

函数模板:
  1. // 定义
  2. template <typename T>
  3. inline T const& Max (T const& a, T const& b) {
  4.     return a < b ? b : a;
  5. }
  6. // 使用
  7. int i = 1, j = 2;
  8. cout << Max(i, j);
复制代码
其中carpture是捕获列表,params是参数,opt是选项,ret则是返回值的类型,body则是函数的具体实现。
静态变量

全局(静态)存储区:分为 DATA 段和 BSS 段。DATA 段(全局初始化区)存放初始化的全局变量和静态变量;BSS 段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。
对于C语言的全局和静态变量,初始化发生在任何代码执行之前,属于编译期初始化。
而C++标准规定:****全局或静态对象当且仅当对象首次用到时才进行构造。

回调

自己的函数调用了别人的函数,其中别人的函数又调用了自己的函数,就是回调;回调是函数指针的应用场景。
比如自己调用sort函数,使用自己定义的cmp比较函数,这就是回调,因为sort调用了自己的cmp比较函数,并且是通过函数指针的形式调用的(sort在实现时寻找了cmp函数的入口地址)。
nullptr调用成员函数可以吗?为什么?

能,因为在编译时对象就绑定了函数地址,和指针空不空没关系。
说说什么是野指针,怎么产生的,如何避免?

说说内联函数和宏函数的区别?

★说说new和malloc的区别,各自底层实现原理

答案解析
malloc底层实现:当开辟的空间小于 128K 时,调用 brk()函数;当开辟的空间大于 128K 时,调用mmap()。malloc采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空闲块,每一个空闲块记录了一个未分配的、连续的内存地址。
new底层实现:关键字new在调用构造函数的时候实际上进行了如下的几个步骤:
★程序启动的过程

请简述一下atomoic内存顺序(网上搜不到)

有六个内存顺序选项可应用于对原子类型的操作:
除非你为特定的操作指定一个顺序选项,否则内存顺序选项对于所有原子类型默认都是memory_order_seq_cst。
构造函数分类

默认构造函数、初始化构造函数、拷贝构造函数、移动构造函数
  1. // 定义
  2. template <class T>
  3. class Stack {
  4.   private:
  5.     vector<T> elems;
  6.   public:
  7.     void push(T const&);
  8.     void pop();
  9.     T top() const;
  10.     bool empty() const{
  11.       return elems.empty();
  12.     }
  13. };
  14. template <class T>
  15. void Stack<T>::push (T const& elem) {
  16.     elems.push_back(elem);
  17. }
  18. template <class T>
  19. void Stack<T>::pop () {
  20.     if (elems.empty()) {
  21.         throw out_of_range("Stack<>::pop(): empty stack");
  22.     }
  23.     elems.pop_back();
  24. }
  25. template <class T>
  26. T Stack<T>::top () const
  27. {
  28.     if (elems.empty()) {
  29.         throw out_of_range("Stack<>::top(): empty stack");
  30.     }
  31.     return elems.back();
  32. }
  33. // 使用
  34. Stack<int> intStack;
  35. Stack<string> stringStack;
复制代码
说说一个类,默认会生成哪些函数

★说说 C++ 类对象的初始化顺序,有多重继承情况下的顺序

参考答案
简述下向上转型和向下转型

★模板的实例化和具体化

[code]// #1 模板定义templatestruct TemplateStruct{    TemplateStruct()    {        cout




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4