如何做网站页面,wordpress登陆后台,网站收录情况查询,设计师网上接单软件C/C面试八股 C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的#xff1f;构造函数为什么不能是虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存对齐是什么#xff1f;为什么要内存对齐static关键… C/C面试八股 C和C语言的区别简单介绍一下三大特性多态的实现原理虚函数的构成原理虚函数的调用原理虚表指针在什么地方进行初始化的构造函数为什么不能是虚函数虚函数和纯虚函数的区别抽象类类对象的对象模型内存对齐是什么为什么要内存对齐static关键字的作用指针和引用的区别介绍一下vector的扩容过程vector如何释放内存空间map与unordered_map的区别对于插入来说operator[]与insert的区别对于访问来说operator[]与.at的区别new和malloc的区别new的实现原理operator new的原理malloc的实现原理内存泄露的检测工具特殊类的设计C11的锁有哪些C11的智能指针几种排序的思路代码实现 C和C语言的区别 一.C解决了很多C语言固有的缺陷 针对C语言中存在命名冲突C提供了命名空间来解决 2.C语言不支持函数缺省参数C也提供了缺省参数的方法 3.在C语言中由于宏函数的有效性无法检查所以C提出了内联函数解决 二.在C语言指针的基础上C提出了引用 三.C可以实现函数重载原因是C语言对于函数的区分是用函数名来区分的而C是使用函数名函数参数列表来区分的因此C语言中只要函数名称一致就会导致编译器报错而C中可以设置函数名称一致而参数列表不同的函数作为函数的重载形式 四.C语言采用的是面向过程的编程思想专注于过程。而C采用的是面向对象的编程思想关注的是对象靠对象之间的交互完成 五.C语言的结构体中只能定义变量而C的类中既可以定义变量也可以定义函数 简单介绍一下三大特性
封装就是将数据和对数据的操作方式结合起来隐藏细节对外暴露一些接口以供对象之间进行交互本质上是为了让用户更好的管理类
继承是一种代码的复用手段目的是在原有类的基础上进行扩展增加新的功能生成新的类
多态就是多种形态当完成某个动作时不同的对象去完成产生不同的状态 多态可以分为静态多态和动态多态 静态多态是在程序编译阶段就确定了函数的执行动作典型例子是函数重载。 动态多态是在程序运行时通过传递的对象实际类型来确定函数的执行典型例子是函数的重写
多态的实现原理
多态的实现条件 1.需要首先让派生类重写基类的虚函数 2.通过基类的指针或引用来调用虚函数
多态的实现原理 某个类成员函数被virtual修饰之后该类的对象模型中就会有一个虚表指针这个指针指向一个虚表该虚表中就会存放虚函数地址。 当某个派生类将该基类继承之后该派生类的对象模型中也会有一个和基类中一直的虚表指针如果这个派生类将基类中的虚函数进行了重写那么自己的虚表中就会将原来基类虚表中对应的虚函数指针替换 此时如果我们使用基类的指针或引用去调用虚函数那么如果传递的是基类对象那么就会通过this指针去调用基类对象的成员函数如果传递的是子类对象那么就会通过this指针去调用子类对象的成员函数。
虚函数的构成原理
在编译阶段将虚函数按照在类中的声明次序依次添加到虚表中
在单继承体系下子类虚表的构建原理 1、原封不动将基类虚表中的内容拷贝一份到子类虚表中 2、如果子类中哪个函数重写了基类虚表中的虚函数则将虚表中对应的虚函数指针替换为当前重写后的虚函数指针 3、将子类新增的虚函数按照在子类中声明的次序进行添加
虚函数的调用原理
通过实际传入的对象的this指针拿到对应的虚表指针再通过对应的虚表指针找到对应的虚表然后通过虚表中存放的虚函数地址来进行虚函数的调用。
包含有虚函数的类对象编译器在编译时就为该对象创建了一个虚表指针以便于能够正确的获取该类的虚表
虚表指针在什么地方进行初始化的
在构造函数中进行虚表的创建和虚表指针的初始化
构造函数为什么不能是虚函数
因为虚函数对应一个虚表指针这个虚表指针是存储在对象的内存空间的构造函数就是用来去开辟对象的内存空间 的如果构造函数是虚函数意味着在对象内存空间还不存在的就要去初始化对象内存空间中的值是无法实现的
虚函数和纯虚函数的区别
虚函数目的是建立抽象模型方便系统扩展 纯虚函数是不具体实现的函数一种特殊的函数
虚函数必须是类的非静态成员
纯虚函数是虚函数的子集用于抽象类包含有纯虚函数的类是抽象类不能实例化对象 因为有时候基类实例化对象是不合理的例如基类是动物子类是猫狗那么基类本身可以创建对象就是不合理的那么用纯虚函数修饰之后让基类无法创建对象才是较为合理的
抽象类
包含纯虚函数的类就是抽象类 抽象类不能实例化对象只能在该类被派生之后并且所有的纯虚函数都被重写之后才能被创建对象
类对象的对象模型
类对象中只存储了类的成员变量并且按照成员变量的声明顺序进行存储遵循内存对齐原则如果存在虚函数那么会有虚表指针如果存在虚拟继承那么还会有一个虚基表指针。 在继承体系下如果是普通的继承那么子类对象的对象模型是 首先是基类继承然后是子类新增
如果是虚拟继承 继承自多个基类那么按照派生类的声明顺序进行。 每个来自基类的对象模型中只存储一个虚基表指针指向各自基类对应位置 然后是子类新增最后是基类成员变量
内存对齐是什么为什么要内存对齐
1、提高内存访问效率 2、减小内存占用量
static关键字的作用
static关键字的作用: static关键字的作用
指针和引用的区别 1.指针存储的是地址而引用是对变量的一个别名 2.引用在定义时必须初始化而指针不用 3.指针可以通过修改值来改变指针的指向引用关系一旦确立引用的实体就不能改变了 4.sizeof时传递的是指针计算的是指针占空间的大小引用是变量类型的大小 5.指针需要显式解引用引用不用 6.存在空置指针而不存在空值引用 介绍一下vector的扩容过程
vector如何释放内存空间
map与unordered_map的区别
1.map的底层是红黑树unordered_map底层是哈希表 2.map是按照key有序的unordered_map无序 3.map的查询效率是O(logn)unordered_map是O(1) 4.map更适合需要数据有序对查询效率不是那么高的场景unordered_map适合对查询效率极高的场景
对于插入来说operator[]与insert的区别
如果key存在那么都会插入失败但是operator[]会将原来的key对应的value替换为新的value而insert不进行任何操作 如果key不存在那么都会插入成功通过key和value构造键值对进行插入
operator[]底层调用的是insertinsert返回的是对应位置的迭代器operator[]拿到返回的迭代器返回的是key对应的value
对于访问来说operator[]与.at的区别
如果key存在operator[]和.at()一样会返回key对应的value 如果key不存在operator[]会key和默认的value构成键值对插入map中
new和malloc的区别
1.new是关键字malloc是库函数 2.new申请空间失败会抛异常malloc不会 3.new只需要传递类型编译器会根据类型判断申请空间大小malloc需要手动传递字节数 4.new申请空间之后不需要进行类型转换malloc需要 5.new在申请空间之后还会调用构造函数进行对象的构造而malloc不会同理delete会自动调用析构函数而free不会
new的实现原理
1、调用operator new()函数申请空间 2、在申请的空间上执行构造函数完成对象的构造
operator new的原理
1、调用malloc函数申请空间 2、如果申请成功返回空间地址如果申请失败会执行用户定义的方法继续申请空间如果用户没有定义申请失败的方法那么就会抛异常
malloc的实现原理
1、内存管理内存管理的数据结构是一个链表 每个节点表示的是一个内存块调用malloc时先遍历该链表找到一块足够大的内存块标记为已分配状态 2、内存分配将已分配的内存块首地址返回给程序
内存泄露的检测工具
在linux下进行内存泄漏的检测工具valgrind 在win下的内存泄漏检测工具VLD
特殊类的设计
设计类不能被继承将构造函数私有化 设计类不能被拷贝将拷贝构造和赋值运算符重载只声明不定义 设计类只能从堆上创建对象 方法一将构造函数和拷贝构造函数私有化设置一个静态成员函数函数内通过new创建对象返回对象指针 设计类只能从栈上创建对象 方法一将构造函数私有化将operator new()禁掉 方法二将构造函数和拷贝构造函数私有化设置一个静态成员函数在该函数中调用构造函数返回对象
设计一个单例类 饿汉模式将构造拷贝构造赋值运算符都私有化类内声明一个私有的静态类对象和一个公有的静态成员函数在函数内对静态类对象进行初始化返回对象指针
懒汉模式将构造函数和拷贝构造函数和赋值运算符重载都私有化类内声明一个私有的静态类对象指针和一个公有的静态成员函数在函数中new一个对象的指针赋值给该静态对象指针。需要注意的是double chack
C11的锁有哪些
六大种 1、mutex 2、recursive_mutex 3、timed_mutex 4、recursive_timed_mutex 5、lock_guard对mutex进行封装实现了RAII可以预防死锁 6、unique_lock在lock_guard上增加了加锁解锁查看锁状态等功能
C11的智能指针
auto_ptr已资源管理权限转移的方式解决浅拷贝弃用容易造成野指针
unique_ptr已资源独占的方式解决浅拷贝无法拷贝不方便
shared_ptr已资源计数的方式解决浅拷贝容易造成循环引用的问题解决方式是weak_ptr用ListNode的例子解释
几种排序的思路代码实现