当前位置: 首页 > news >正文

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、类模板和模板类的区别 

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

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

 

相关文章:

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

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 思维导图链接&#xff1a;面向对象的性质 持续更新中…… &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 …...

点云深度学习系列:Sam2Point——基于提示的点云分割

文章&#xff1a;SAM2POINT:Segment Any 3D as Videos in Zero-shot and Promptable Manners 代码&#xff1a;https://github.com/ZiyuGuo99/SAM2Point Demo&#xff1a;https://huggingface.co/spaces/ZiyuG/SAM2Point 1&#xff09;摘要 文章介绍了SAM2POINT&#xff0c;这是…...

mysql学习教程,从入门到精通,TOP 和MySQL LIMIT 子句(15)

1、TOP 和MySQL LIMIT 子句内容 在SQL中&#xff0c;不同的数据库系统对于限制查询结果的数量有不同的实现方式。TOP 关键字主要用于 SQL Server 和 Access 数据库中&#xff0c;而 LIMIT 子句则主要用于 MySQL、PostgreSQL&#xff08;通过 LIMIT/OFFSET 语法&#xff09;、S…...

备战软考Day02-数据结构与算法

1.基本概念与三要素 1.什么是数据 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 2.数据元素、数据项 数据元素是数据的基本单位&#xff0c;通常作为一个整体进行…...

COMP 6714-Info Retrieval and Web Search笔记week1

哭了哭了&#xff0c;这周唯一能听懂的就这门 目录 IR&#xff08;Information Retrieval)是什么&#xff1f;IR的基本假设Unstructured (text) vs. structuredDocuments vs. Database Records比较文本&#xff08;Comparing Text&#xff09;IR的范围(Dimensions of IR)IR的任…...

C++在Linux实现多线程和多进程的TCP服务器和客户端通信

多进程版本 服务器 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/wait.h> #include <signal.h> #include <string&…...

音视频开发常见的开源项目汇总

FFmpeg 地址&#xff1a;https://ffmpeg.org/介绍&#xff1a;FFmpeg 是一个非常强大的开源多媒体框架&#xff0c;它可以用来处理视频和音频文件。它支持多种格式的转换、编码、解码、转码、流处理等。FFmpeg 包括了 libavformat、libavcodec、libavutil、libswscale、libpos…...

Java操控Redis (面经之 使用Redis)

操控Redis的工具 ReactiveRedisTemplate 和 RedisTemplate : RedisTemplate&#xff1a; 它是一个通用的模板类&#xff0c;可以使用任何序列化策略来序列化和反序列化键和值。默认情况下&#xff0c;它使用 JdkSerializationRedisSerializer 序列化值&#xff0c;并使用 Strin…...

【计网】从零开始使用UDP进行socket编程 --- 服务端业务实现

在我们每个人都曾经历过“沮丧”时刻里&#xff0c; 如果我们不能对别人说有益的好话&#xff0c; 那我们最好还是什么也别说。 --- 卡耐基 《人性的弱点》--- 从零开始使用UDP进行socket编程 1 前情提要2 单词翻译2.1 业务需求2.2 设计字典类2.3 服务端与客户端逻辑2.4 运…...

正式发售!《黑神话:悟空》背后的技术力量——UE5与实时云渲染

千呼万唤始出来&#xff0c;《黑神话&#xff1a;悟空》终于在今年8月发售了&#xff0c;相信大家都已经玩起来了&#xff01; 作为国产游戏的画质巅峰之作&#xff0c;《黑神话&#xff1a;悟空》凭借其令人叹为观止的画面质量和游戏体验&#xff0c;赢得了广泛的好评。这一切…...

qt-creator-10.0.2之后版本的jom.exe编译速度慢下来了

1、Qt的IDE一直在升级&#xff0c;qt-creator的新版本下载地址 https://download.qt.io/official_releases/qtcreator/ 2、本人一直用的是qt-creator-10.0.2版本&#xff0c;官网历史仓库可以下载安装包qt-creator-opensource-windows-x86_64-10.0.2.exe https://download.qt…...

2024CSP-J初赛全真模拟卷选择题篇(原创,难度偏简单)

注意&#xff0c;本卷由再临TSC原创&#xff0c;禁止转载&#xff01; 本卷难度偏简单&#xff0c;若想要通过初赛本卷应拿80分左右 查看答案的方法&#xff1a; if(设备"PC") { 把光标移到答案上面&#xff0c;选中答案&#xff0c;就会显示()&#xff1b; } …...

【Android 13源码分析】WindowContainer窗口层级-4-Layer树

在安卓源码的设计中&#xff0c;将将屏幕分为了37层&#xff0c;不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析&#xff0c;整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…...

C# 开发教程-中级教程

1.C# 多线程/异步 C# 异步编程Task整理&#xff08;一&#xff09; C# 异步编程Task整理&#xff08;二&#xff09;异常捕捉 C# 异步编程Task(三) async、await C#中创建线程&#xff0c;创建带参数的线程 C# 线程同步之排它锁/Monitor监视器类 C# lock关键词/lock语句块…...

【C++】c++的继承

目录 思维导图大纲&#xff1a; 1.基类和派生类 1.1 定义格式 1.2 继承方式 1.3 基类和派生类的转换 2. 继承中的作用域(隐藏关系) 2.1 考察继承作⽤域相关选择题 3. 派生类的默认成员函数 4. 继承类模板 5. 一个不能被继承的类 ​编辑 6.继承与友元 ​编辑 7. 继…...

【ShuQiHere】 进制转换的世界:从十进制到二进制、十六进制的转换技巧

【ShuQiHere】 在计算机科学中&#xff0c;进制转换&#xff08;Radix Conversion&#xff09; 是一个基础且非常重要的技能。无论是理解计算机的存储、数据表示&#xff0c;还是在编程中处理不同的进制数据&#xff0c;进制转换都是不可或缺的。本文将详细讲解 十进制&#x…...

《化工管理》

《化工管理》征稿简则 《化工管理》杂志是由中国石油和化学工业联合会主管、中国化工企业管理协会主办&#xff0c;1986年创刊&#xff0c;在国内外公开发行&#xff0c;国内统一连续出版物号&#xff1a;CN 11—3991/F&#xff0c;中国标准连续出版物号&#xff1a;ISSN 1008—…...

LeetCode70:爬楼梯

class Solution { public:int climbStairs(int n) {if(n 1) return 1;if(n 2) return 2;vector<int> dp(n 1, 0);dp[1] 1;dp[2] 2;for(int i 3; i < n 1; i){dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }; 这个题目也就是最简单的动态规划&#xff0c;题目…...

[程序员] 前人留下的苦难源,我们是否有勇气改正?

最近遇到一个客户现场发现的&#xff0c;表象是网络有问题&#xff0c;分析一圈下来发现是程序进入了某种死循环状态&#xff0c;耗尽CPU。 产品里的很多线程/进程的优先级设置的很高&#xff0c;甚至高过了内核运行程序的优先级&#xff0c;高过了产品内警告处理程序的运行&a…...

聚类_K均值

import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs1.数据预处理 #创建基于高斯分布的样本点, x是点的坐标&#xff0c;y是所属聚类值 x, y make_blobs(n_samples100, centers6, random_state100, cluster_std0.6) # 设置图形尺寸…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...