C++八股文之面向对象篇

🤖个人主页:晚风相伴-CSDN博客

思维导图链接:面向对象的性质

持续更新中……

💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧

🙏如果内容有误或者有写的不好的地方的话,还望指出,谢谢!!!

让我们共同进步

目录

1、什么是面向对象

2、面向对象和面向过程的区别 

3、面向对象的三大特性 

4、重载和重写的区别 

 5、重载和重写的实现

 6、构造函数的种类和作用

7、向上转型和向下转型 

8、虚函数重写的条件 

9、深拷贝和浅拷贝 

10、静态多态和动态多态 

11、虚析构和虚构造 

12、类继承的访问权限 

13、虚函数和纯虚函数的区别 

14、纯虚函数不能实例化的原因

 15、拷贝构造函数的参数

16、拷贝赋值和移动赋值的区别

17、虚函数表 

18、final和override

19、类模板和模板类的区别 


1、什么是面向对象

面向对象是一种编程思想,把一切东西都看成是一个个对象,比如人、耳机等,他们都有各自的属性

2、面向对象和面向过程的区别 

面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 

3、面向对象的三大特性 

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
多态:用父类指针指向子类的示例,然后通过父类指针调用实际子类的成员函数。实现多态 

4、重载和重写的区别 

重写是指在派生类中重新定义的函数。其函数名,参数列表,返回值类型,所有都必须同基类中被重写的函数一致。只有函数体不同,派生类对象调用时会调用派生类的重写函数,不会调用被重写的函数。重写的基类中被重写的函数必须有virtual修饰
重载是指同一作用域内被声明的几个具有不同参数列表的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型 

 5、重载和重写的实现

重载的实现:C++利用命名倾轧技术,来改变函数名,区分参数不同的同名函数。命名倾轧是在编译阶段完成的。

例如:void func(int a, int b)那么在编译的时候会把参数也加上,就变成了funcii
重写的实现:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。这就实现了一个多态 

 6、构造函数的种类和作用

 默认构造、初始化构造、拷贝构造、移动构造

  1. 默认构造函数和初始化构造函数。在定义类的对象的时候,完成对象的初始化工作
  2. 赋值构造函数默认实现的是值拷贝(浅拷贝) 
  3. 移动构造函数。用于将其他类型的变量,隐式转换为本类对象

7、向上转型和向下转型 

子类转换为父类:向上转型,使用dynamic_cast<type_id>(expression) ,这种转换相对来说比较安全不会有数据的丢失

父类转换为子类:向下转型,可以使用强置转换,但这种转换是不安全的,会导致数据的丢失,原因是父类的指针或者引用的内存中可能不包含子类的成员的内存。

8、虚函数重写的条件 

  1. 派生类可以不加virtual依旧满足重写,因为继承后父类的虚函数接口在子类中依旧保持虚函数属性
  2. 返回值是具有父子关系的指针或者引用(父类返回父类指针,子类返回子类指针)这个也叫做协变
  3. 析构函数的重写,如果父类的析构函数为虚函数,此时子类析构函数只要定义,无论是否加virtual关键字,都与父类析构函数构成重写。

9、深拷贝和浅拷贝 

浅拷贝:又称值拷贝,将源对象的值拷贝到目标对象中去,本质上来说源对象和目标对象共用一份实体,只是所引用的变量名不同,地址其实还是相同的。

深拷贝:拷贝的时候先开辟出和源对象大小一样的空间,然后将源对象里的内容拷贝到目标对象中,这样两个指针就指向了不同的内存位置。

10、静态多态和动态多态 

静态多态也称编译时多态或早期绑定多态。这种多态性通常是用重载实现,编译器根据调用时的参数类型和数量来决定使用哪个版本的函数

动态多态也称运行时多态,这种多态性通常通过虚函数来实现,允许子类重写父类的方法,并且能够在运行时根据对象的实际类型来选择合适的方法。

实现多态的条件
1. 虚函数。基类中必须有虚函数,在派生类中必须重写虚函数。
2. 通过基类类型的指针或引用来调用虚函数。  

11、虚析构和虚构造 

虚析构:将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。如果基类的析构函数不是虚函数,在特定的情况下会导致派生类无法被析构。

虚构造:虚函数对应一个虚表,这个表的地址是存储在对象的内存空间的。如果将构造函数设置为虚函数,就需要虚表中调用,可是对象还没有实例化,没有内存空间分配,调用不了(相违背) 

12、类继承的访问权限 

public继承:派生类可以访问基类的public、protected成员,不可以访问基类的private成员;派生类对象可以访问基类的public成员,不可以访问基类的protected、private成员。


protected继承:派生类可以访问基类的public、protected成员,不可以访问基类的private成员;派生类对象不可以访问基类的public、protected、private成员。


private继承:派生类可以访问基类的public、protected成员,不可以访问基类的private成员;;派生类对象不可以访问基类的public、protected、private成员。 

13、虚函数和纯虚函数的区别 

  1. 虚函数和纯虚函数可以定义在同一个类中,含有纯虚函数的类被称为抽象类,而只含有虚函数的类不能被称为抽象类
  2. 虚函数可以被直接使用,也可以被子类重载以后,以多态的形式调用,而纯虚函数必须在一个子类中实现该函数才可以使用,因为纯虚函数在基类有声明而没有定义。
  3. 虚函数和纯虚函数都可以在子类中被继承,以多态的形式被调用。
  4. 虚函数和纯虚函数通常存在于基类中,被子类所继承,目的是提供一个统一的接口。
  5. 虚函数的定义形式:virtual{};纯虚函数的定义形式:virtual{}=0;在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时要求前期绑定,然而虚函数却是动态绑定,而且被两者修饰的函数声明周期也不一样。

14、纯虚函数不能实例化的原因

纯虚函数在类的vftable中对应的表项被赋值为0。也就是指向一个不存在的函数。由于编译器绝对不允许有调用一个不存在的函数的可能,所以该类不能生成对象。在它的派生类中,除非重写此函数,否则也不能生成对象

 15、拷贝构造函数的参数

  1. 拷贝构造函数的参数必须使用引用传递
  2. 如果使用传值的方式,那么会调用该类的拷贝构造函数,从而造成无穷递归地调用拷贝构造函数。传指针也和传值一样。

16、拷贝赋值和移动赋值的区别

  1. 拷贝构造函数的形参是一个左值引用,而移动构造函数的形参是一个右值引用
  2. 拷贝构造函数完成的是整个对象或变量的拷贝,而移动构造函数时生成一个指针指向源对象或变量的地址,接管源对象的内存,相对于大量数据的拷贝节省时间和内存空间。

17、虚函数表 

  1. 虚函数表是一个存储虚函数地址的数组,以NULL结尾。虚表在编译阶段生成,对象内存空间开辟后,写入对象中的虚表指针,然后调用构造函数。即虚表在构造函数之前写入。
  2. 除了在构造函数之前写入外,我们还需要考虑到虚表的二次写入机制,通过次机制让每个对象的虚表指针都能准确的指向到自己类的虚表,为实现动态多态提供支持。
  3. 虚表是在静态区的,并且虚表只有一份

对于派生类的虚表生成

  1. 先将基类的虚表内容拷贝一份到派生类虚表中
  2. 如果派生类重写了基类的某个虚函数,那么派生类自己的虚函数覆盖虚表中基类的虚函数
  3. 派生类自己增加的虚函数按其在派生类的声明顺序添加到派生类虚表的最后。

18、final和override

final用于修饰虚函数,表示该虚函数不能被重写

override用于检查子类虚函数是否重写了父类的某个虚函数,如果没有则编译报错

19、类模板和模板类的区别 

类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数

模板类是实实在在的类定义,是类模板的实例化,类定义中参数被实际类型所替代 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/140708.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【CSS in Depth 2 精译_031】5.3 Grid 网格布局的两种替代语法

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

【VSCode】VSCode Background 背景插件辅助窗口程序

前排贴上Github项目链接 GitHub窗口项目链接 这是一个基于VSCode上由shalldie上传的background扩展制作的windows窗口程序。 该程序旨在通过窗口程序尽可能的完善该扩展原有的功能。 background - shalldie 的最大优势是我目前仅在其扩展上发现了UseFront的选项&#xff0c;这…

2011年全国硕士研究生入学统一考试计算机科学与技术

1. 试卷背景&#xff1a; 试题&#xff1a;2011年全国硕士研究生入学统一考试计算机科学与技术学科联考中的计算机学科专业基础综合试题。难点&#xff1a;该问题的研究难点在于试题涵盖了计算机科学与技术的多个方面&#xff0c;包括数据结构、算法、计算机组成原理、操作系统…

text2sql(NL2Sql)综述《The Dawn of Natural Language to SQL: Are We Fully Ready?》

《The Dawn of Natural Language to SQL: Are We Fully Ready?》(github)出自2024年6月的NL2SQL(Natural language to SQL )综述论文。这篇论文尝试回答如下三个问题&#xff1a; 问题1:NL2SQL的现状是什么&#xff1f;(Q1:Where Are we Now?) 论文图1总结了近20年NL2SQL方法…

Qt:懒汉单例(附带单例使用和内存管理)

前言 本文主要写懒汉单例以及单例的释放&#xff0c;网上很多教程只有单例的创建&#xff0c;但是并没有告诉我们单例的内存管理&#xff0c;这就很头疼。 正文 以下是两种懒汉单例的写法 1. 懒汉式单例&#xff08;多线程不安全&#xff0c;但是在单线程里面是安全的&…

protobuf中c、c++、python使用

文章目录 protobuf实例&#xff1a;例题1&#xff1a;[CISCN 2023 初赛]StrangeTalkBot分析&#xff1a;思路&#xff1a;利用&#xff1a; 例题2&#xff1a;[CISCN 2024]protoverflow分析&#xff1a; protobuf Protocol Buffers&#xff0c;是Google公司开发的一种数据描述语…

二十三种设计模式之原型模式

一.什么是原型模式 ‌‌原型模式是一种创建型对象设计模式&#xff0c;它通过复制一个已经创建的实例&#xff08;即原型对象&#xff09;来创建一个和原型对象相同的新对象。‌ 这种模式在面向对象软件设计中非常有用&#xff0c;因为它允许通过复制现有对象来快速生成多个相似…

新160个crackme - 057-bbbs-crackme04

运行分析 因软件版本老旧&#xff0c;需使用windows XP虚拟机运行有个SystemID&#xff0c;值为12345678需破解User ID和Password PE分析 yC壳&#xff0c;32位 OD手动脱壳 使用windows XP虚拟机&#xff0c;将程序拖入OD按一下F8&#xff0c;ESP变红&#xff0c;根据ESP定律设…

子比主题美化 - 可移动悬浮窗 弹窗功能代码教程

移动页面演示效果 这个功能完全适配子比主题使用&#xff0c;代码开源&#xff0c;可以做其它功能弹窗或者菜单栏等等&#xff0c;后期有时间在做成桌面页面也可以鼠标移动&#xff0c;点击参考&#xff1a;移动悬浮窗详细代码教程

黑马十天精通MySQL知识点

一. MySQL概述 安装使用 MySQL安装完成之后&#xff0c;在系统启动时&#xff0c;会自动启动MySQL服务&#xff0c;无需手动启动。 也可以手动的通过指令启动停止&#xff0c;以管理员身份运行cmd&#xff0c;进入命令行执行如下指令&#xff1a; 1 、 net start mysql80…

SpringBoot父子工程搭建

SpringBoot父子工程搭建 1、父工程 1.1、创建父工程 1.2、移除无用文件 1.3、修改pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…

秋韵虫趣.

文章目录 虫鸣概览虫坛文化蟀种纷呈中华蟋蟀宁阳蟋蟀刻点铁蟋长颚斗蟋 油葫芦棺头蟋中华灶蟋小素蟋树皮蟋蟀 花生大蟋斑腿针蟋其他鸣虫树蟋&#xff0c;又名竹蛉、邯郸梨片蟋&#xff0c;又名金钟、天蛉、绿蛣蛉、银琵琶凯纳奥蟋&#xff0c;又名石蛉&#xff0c;鳞蟋黄蛉蟋&am…

NarratoAI利用AI大模型,一键解说并剪辑视频

测试视频: 字幕/配乐后期添加的,视频由NarratoAI自动生成的 雪迷宫-NarratoAI利用AI大模型剪辑解说视频测试 WIN整合包 下载链接&#xff1a;https://pan.quark.cn/s/8f54ef99e3fb 使用前先更新&#xff0c;运行update.bat Gemini API Key 访问 https://aistudio.google.c…

quartz 搭配SQL Server时出现deadlock的解决方案

背景&#xff1a; 最近在折腾换OA系统&#xff0c;遇到了一个很诡异的事情。在测试阶段&#xff0c;OA系统经常莫名地宕机&#xff0c;停止响应。查下来&#xff0c;发现是数据库出现大量死锁&#xff0c;耗尽了连接池。出现问题的语句是一样的&#xff0c;问题锁定在QRTZ_TRI…

C++ 面试必备知识大全:从基础到高级特性全面解析

创作不易&#xff0c;您的打赏、关注、点赞、收藏和转发是我坚持下去的动力&#xff01; C 面试中常见的问题涵盖了语言基础、面向对象编程、内存管理、STL&#xff08;标准模板库&#xff09;、并发编程、设计模式等。以下是一些常见的 C 面试问题及其详细答案总结&#xff1…

第311题| 超好用!二重积分求旋转体体积公式|武忠祥老师每日一题

第一步&#xff1a; &#xff08;1&#xff09;找渐近线&#xff0c;先看水平渐近线&#xff0c;看x趋于无穷时&#xff0c;y有没有趋于一个有限的值。 , 得出水平渐近线y1。因为左右两边都是水平渐近线&#xff0c;所以没有斜渐近线。 第二步&#xff1a; 画出图像&#…

e选择排序---复杂度O(X^2)

排序原理: 1.每一次遍历的过程中&#xff0c;都假定第一个索引处的元素是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个素引处的值&#xff0c;则假定其他某个索引出的值为最小值&#xff0c;最后可以找到最小值所在的索引 2.交换第一个索引处和最小值所…

LocalMamba: Visual State Space Model with Windowed Selective Scan 论文总结

题目&#xff1a;LocalMamba: Visual State Space Model&#xff08;视觉状态空间模型&#xff09; with Windowed Selective Scan&#xff08;窗口化的选择扫描&#xff09; 论文&#xff1a;[2403.09338] LocalMamba: Visual State Space Model with Windowed Selective Scan…

STM32F407单片机开发入门(二)STM32F407VET6单片机详解

文章目录 一.概要二.单片机型号命名规则三.STM32F407系统架构四.STM32F40VET6单片机启动流程五.STM32F40VET6单片机主要外设资源六.开发过程中查看芯片数据手册的必要性1.单片机外设资源情况2.STM32F407单片机内部框图3.STM32F407单片机管脚图4.STM32F407单片机每个管脚功能5.单…

艾里斑(Airy Disk)与瑞利判据(Rayleigh criterion)

艾里斑的定义与形成 艾里斑&#xff08;Airy Disk&#xff09;&#xff0c;又称艾里图样&#xff08;Airy Pattern&#xff09;&#xff0c;是光通过圆形孔径发生衍射时&#xff0c;在焦点处形成的光斑。这一现象由英国数学家和天文学家George Biddell Airy在19世纪首次详细描…