当前位置: 首页 > 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) # 设置图形尺寸…...

Mac电脑剪切板在哪里找 苹果电脑剪切板打开教程【详解】

Windows 和 Mac 电脑在使用方式上存在一些差异&#xff0c;许多习惯了 Windows 系统的用户初次接触 Mac 时可能会对某些操作感到困惑。比如&#xff0c;很多人会问&#xff1a;Mac 上的剪贴板在哪里&#xff1f;如果你也有这样的疑问&#xff0c;不妨看看下面这篇关于如何在 Ma…...

Python编程 - 三器一包

目录 前言 一、迭代器 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;迭代器和可迭代对象 &#xff08;三&#xff09;创建迭代器 &#xff08;四&#xff09;内置迭代器函数 &#xff08;五&#xff09;优点和局限性 二、生成器 &#xff08;一&…...

InternVL 多模态模型部署微调实践

友情链接 该文档参考InternVL垂直领域场景微调实践而写成&#xff0c;感谢社区同学法律人的文档。 写在前面&#xff08;什么是InternVL&#xff09; InternVL 是一种用于多模态任务的深度学习模型&#xff0c;旨在处理和理解多种类型的数据输入&#xff0c;如图像和文本。它…...

Ruby Dir 类和方法

Ruby Dir 类和方法 Ruby 中的 Dir 类提供了用于处理目录的各种方法。这些方法允许您列出目录内容、更改当前工作目录、创建和删除目录等。本文将详细介绍 Dir 类的常用方法&#xff0c;并通过示例展示如何使用它们。 目录 Dir 类的简介常用方法 Dir.chdirDir.childrenDir.de…...

C++STL~~deque

文章目录 deque的概念deque的使用deque的练习总结 deque的概念 deque(双端队列)&#xff1a;是一种序列容器、是一种双开口的"连续"空间的数据结构&#xff0c;双开口的含义是&#xff1a;可以在头尾两端进行插入和删除操作&#xff0c;且时间复杂度为O(1)&#xff…...

SpringCloud的学习,Consul服务注册与发现、分布式配置,以及 服务调用和负载均衡

介绍 Consul 是一套开源的分布式服务发现和配置管理系统&#xff0c;由 HashiCorp 公司用 Go 语言开发。 提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用&#xff0c;也可以一起使用以构建全方位的服务网格&#xff0c;…...

闯关leetcode——26. Remove Duplicates from Sorted Array

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/ 内容 Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appear…...

基于A2C与超启发式的航天器星载自主任务规划算法-笔记

1. Actor-Critic 模块 主要文件&#xff1a;AC.py, PolicyNet.py, ValueNet.py作用&#xff1a;该模块实现了 A2C&#xff08;Advantage Actor-Critic&#xff09;强化学习算法。其中&#xff0c;ActorCritic 类是核心&#xff0c;它同时管理策略网络&#xff08;Actor&#x…...

[机器学习]决策树

1 决策树简介 2 信息熵 3 ID3决策树 3.1 决策树构建流程 3.2 决策树案例 4 C4.5决策树 5 CART决策树&#xff08;分类&回归&#xff09; 6 泰坦尼克号生存预测案例 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import …...

CentOS7更换阿里云yum更新源

目前CentOS内置的更新安装源经常报错无法更新&#xff0c;或者速度不够理想&#xff0c;这个时候更换国内的镜像源就是一个不错的选择。 备份内置更新源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载阿里云repo源&#xff08;需要系统…...