Day1: 5道C++ 面向对象高频题整理

1、什么是类?
在C++中,类是一种用户定义的数据类型,它可以包含数据成员和函数成员。数据成员用于存储与类相关的状态,而函数成员可以定义对这些数据进行操作的方法。可以把类想象为一个蓝图,根据这个蓝图可以创建对象,这些对象在内存中是类的实例。

比如说,我们可以定义一个Car类来表示汽车。这个类可以有数据成员如brand、color和maxSpeed来存储汽车的品牌、颜色和最高速度等属性。同时,Car类可能有函数成员如accelerate()和brake()来定义汽车加速和刹车的操作。

在现实生活中,每辆汽车都是根据汽车制造商设计的蓝图制造出来的,蓝图定义了汽车的特性和功能,类似地,在编程中,我们根据类创建对象来表示现实世界中的各种事物和概念。

2、面向对象的程序设计思想是什么?
面向对象程序设计(OOP)是一种编程范式,它使用“对象”来设计软件。在OOP中,对象是类的实例,类包含数据(属性)和可以对数据执行操作的方法(行为)。面向对象的核心概念包括封装、继承和多态性(C++三大特性)。

封装:是指将数据(属性)和操作数据的代码(方法)打包在一起,形成一个独立的对象。这样可以隐藏对象的内部细节,只暴露必要的操作接口。比如,一个汽车对象封装了引擎、变速器等细节,只提供加速和刹车等接口。

继承:允许新的类(子类)继承现有类(父类)的属性和方法。继承可以复用代码,并且可以创建层次结构。例如,可以有一个基本的车辆类,然后有子类如汽车、摩托车等,它们继承基本类的共同特性。

多态性:指的是不同类的对象可以通过同一接口调用,具有不同的行为。例如,如果有一个函数接受车辆类的对象,那么任何车辆的子类对象,如汽车或摩托车,都可以使用该函数,但具体的行为会根据对象的实际类型而有所不同。

OOP的思想是通过模仿现实世界来组织和设计代码,使得代码更加模块化、易于理解和维护。通过把现实世界的实体映射成程序中的类和对象,开发者可以在更高的层次上思考问题,这样可以更容易地解决复杂的软件问题。

3、面向对象的三大特征是哪些?
面向对象编程(OOP)的三大特征是封装、继承和多态。它们是OOP中最核心的概念,每个特征都解决了软件开发中的一些常见问题。

封装:封装是隐藏对象内部复杂性的过程,同时暴露出必要的功能。这可以防止外部代码直接访问对象内部的状态,减少了外部干扰和错误使用的可能性。在C++中,通常通过访问修饰符(private、protected、public)来实现封装。

应用场景示例:银行账户类(BankAccount)可能包含私有数据成员来存储账户余额,并提供公共方法来进行存款和取款,而不允许直接修改账户余额。

继承:继承允许新创建的类(称为子类)继承父类的属性和方法。继承可以实现代码复用,并且可以形成一个类的层次结构。

应用场景示例:可以有一个通用的Vehicle类,它包含所有交通工具的共通特征,然后可以有子类如Car、Truck和Motorcycle,它们继承Vehicle类并添加特定于它们的属性和方法。

多态:多态性意味着可以通过基类的指针或引用来调用派生类的方法。这使得程序可以在不知道对象确切类型的情况下对对象进行操作,从而使程序可以在运行时动态决定对象的行为。

应用场景示例:可以定义一个Shape基类,并且有多个派生类如Circle、Rectangle和Triangle。每个派生类都有一个draw()方法的实现。如果有一个Shape类型的数组,程序可以遍历这个数组,并调用每个形状的draw()方法,具体调用哪一个实现,取决于数组元素的实际类型。

这三个特性共同支撑起面向对象编程的基础结构,使得OOP成为了一个强大和灵活的编程范式

4、C++中struct和class有什么区别?
在C++中,struct(结构体)和class(类)在语法上非常相似,但它们有一个主要的默认访问权限和默认继承类型的区别:

默认访问权限:在class中,默认的成员访问权限是私有的(private),而在struct中,默认的是公共的(public)。这意味着除非你明确指定,否则class的成员和继承类型都是私有的,而struct的成员和继承类型默认是公开的。

默认继承类型:当从struct或class继承时,如果没有显式指定继承类型(public、protected或private),struct会默认采用public继承,而class会默认采用private继承。

除了这些默认行为的差异,struct和class在C++中是几乎相同的,它们都可以包含数据成员、成员函数、构造函数、析构函数、成员函数重载、运算符重载等。

在实际使用中,struct通常用于包含数据的简单的聚合类型,而class通常用于需要封装和复杂行为的对象。但这更多是编程风格和传统的选择,而不是强制的规则。

例如,如果你有一个只包含数据的点结构,你可能会选择使用struct:

struct Point {
    int x;
    int y;
};

如果你有一个更复杂的数据结构,可能需要封装和方法来操作数据,你可能会选择使用class

class Car {
private:
    int speed;
    int gear;
public:
    void accelerate(int increment);
    void decelerate(int decrement);
    // 更多的成员函数和构造函数
};

在现代C++编程中,选择struct还是class更多是基于你想要表达的意图,而不是它们的技术区别。

5、动态多态有什么作用?有哪些必要条件?
动态多态是面向对象编程中的一个核心特性,它允许在运行时通过指向基类的指针或引用来调用派生类的方法,使得相同的操作可以作用于不同类型的对象上,从而表现出不同的行为。

动态多态的作用非常广泛,它允许程序代码更加通用和灵活。例如,你可以设计一个函数,它接受一个基类的引用,然后在运行时,这个函数可以用不同派生类的对象来调用,而且不需要修改函数本身的代码。这种能力使得代码重用更加容易,可以构建更加抽象和动态的系统。

动态多态的实现有几个必要条件:

继承:必须有两个类,一个基类和一个从基类派生出来的子类。

基类中的虚函数:在基类中必须有至少一个函数被声明为虚函数(使用virtual关键字)。派生类通常会重写(override)这个虚函数来提供特定的功能。

基类的指针或引用:需要通过基类的指针或引用来调用虚函数,这样C++运行时才能利用虚函数表(v-table)来动态决定调用哪个函数。

动态绑定:当通过基类的指针或引用调用虚函数时,发生的是动态绑定,这意味着直到程序运行时,才决定调用对象的哪个方法。

举个例子,假设有一个基类Shape和两个派生类Circle和Square。基类中有一个虚函数draw()。那么你可以通过Shape的指针或引用来调用draw(),在运行时,如果指向的是Circle对象,则调用的是Circle的draw()实现,如果是Square对象,则调用Square的draw()实现。

这使得程序能够对不同类型的对象进行操作,而无需知道对象的确切类型,从而增加了程序的灵活性和可扩展性。

多态很重要,有时间可以查看这两篇文章,就能理解其中的含义。

浅谈多态的由来(C++)_c++多态的名字由来-CSDN博客

多态的实现原理探究_多态数据结构-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql buffer pool详解

介绍 缓冲池是InnoDB在访问表和索引数据时缓存的主内存区域。缓冲池允许直接从内存访问频繁使用的数据,这加快了处理速度。在专用服务器上,通常会将多达80%的物理内存分配给缓冲池。 为了提高大容量读操作的效率,缓冲池被划分为可能包含多行…

类与对象(三) 拷贝构造与赋值运算符重载

目录 1.拷贝构造 2.运算符重载&#xff08;日期类举例&#xff09; 1. 2.和 3. > > < < 4.赋值运算符重载 5.- 与- 6. -- 7.日期 - 日期 3.const成员函数 4.<<和>>重载 5.取地址重载 1.拷贝构造 拷贝构造也是一个构造函数。我们前…

Linux:动静态库介绍

动静态库 库的介绍开发环境 & 编译器库存在的意义库的实现库的命名静态库制作和使用总结 动态库的制作和使用动态库的使用方法方法一方法二方法三 库加载问题静态库加载问题动态库的加载问题与位置无关码 C/C静态库下载方式 库的介绍 静态库&#xff1a;程序在编译链接的时…

C++初识--------带你从不同的角度理解引用的巧妙之处

1.对于展开的理解 我们这里的展开包括命名空间的展开和头文件的展开&#xff0c;两者的含义是不一样的&#xff1a; 头文件的展开就是把头文件拷贝到当前的文件里面&#xff1b; 命名空间的展开不是拷贝&#xff0c;而是因为编译器本身默认是到全局里面去找&#xff0c;当我…

一些常见的Windows命令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言看版本号查找端口启动程序杀死某个端口查看全部端口看ip进入目录就是总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#x…

Linux——匿名管道

为什么要有进程间通信&#xff1f; 在操作系统中&#xff0c;进程是独立运行的程序&#xff0c;多个进程之间要想互相协作完成任务&#xff0c;就需要进程间通信。 什么是进程间通信&#xff1f; 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#…

03-JAVA设计模式-解析器模式

解释器模式 什么是解析器模式 在Java中&#xff0c;解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;它给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子…

六、e2studio VS STM32CubeIDE之代码自动补全

目录 一、概述/目的 二、eclipse c/c自动补全 2.1 修改实现原理 2.2 修改插件cdt.ui的方法 2.2.1 资料来源 2.2.2 修改的主要流程或逻辑 2.2.3 失败的原因 三、呼吁st和Renesas厂家支持自动补全代码 六、e2studio VS STM32CubeIDE之代码自动补全 一、概述/目的 eclipse…

解决:前端bootstrap的fileInput插件

项目场景&#xff1a; 帮朋友做一个后台管理系统遇到文件上传回显异常的问题。 项目是单体架构&#xff0c;没有前后端分离&#xff0c;前端使用的bootstrap3Thymeleaf。上传插件用的是fileInput。 问题描述&#xff1a; 上传没有问题&#xff0c;完成后点击编辑再次进入无…

从本地创建项目到 Gitee 提交的完整教程

1、本地创建一个新项目 2.进入想上传的项目的文件夹&#xff0c;然后右键点击git bash 3.初始化本地环境&#xff0c;把该项目变成可被git管理的仓库 4.添加该项目下的所有文件到暂存区 5.使用如下命令将文件添加到仓库中去 6.在gitee上创建以自己项目名称命名的空项目 7.将本地…

springboot结合elasticJob

先说一说什么是elasticJob。 ElasticJob是一个分布式任务调度的解决方案&#xff0c;它由俩个相互独立的子项目Elastic-job-lite和Elastic- job-cloud组成。 任务调度&#xff1a;是指系统为了自动完成特定任务&#xff0c;在任务的特定时刻去执行任务的过程。 分布式&#xf…

窗函数的选择

不同的窗函数实质上时对矩形窗进行了不同程度的加权得到的不同类型的窗函数。 将模拟角频率转换为了数字角频率 矩形窗旁瓣过大&#xff0c;两个频率的峰值相差较大&#xff0c;因此无法识别&#xff0c;可以使用旁瓣非常小的窗函数来进行分辨&#xff0c;只是想要达到相同的分…

(C++) this_thread 函数介绍

文章目录 &#x1f6a9;前言⭐std::this_thread&#x1f579;️get_id()&#x1f5a5;️Code&#x1f516;get_id介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep_for<>()&#x1f5a5;️Code&#x1f516;sleep_for介绍&#x1f3f7;️其他介绍 &#x1f579;️sleep…

python基础语法--列表

一、列表的概念 列表&#xff08;List&#xff09;是一种有序、可变、允许重复元素的数据结构。列表用于存储一组相关的元素&#xff0c;并且可以根据需要动态地进行增加、删除、修改和访问。以下是列表的主要特点和操作&#xff1a; 有序性&#xff1a; 列表中的元素是按照它…

最新AI创作系统ChatGPT网站源码Midjourney-AI绘画系统,Suno-v3-AI音乐生成大模型。

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

【CVPR2024】文本到图像的行人再识别中的噪声对应学习

这篇论文的标题是《Noisy-Correspondence Learning for Text-to-Image Person Re-identification》,作者是来自中国四川大学、英国诺森比亚大学、新加坡A*STAR前沿人工智能研究中心和高性能计算研究所的研究人员。论文主要研究了文本到图像的行人再识别(Text-to-Image Person…

Unity进阶之ScriptableObject

目录 ScriptableObject 概述ScriptableObject数据文件的创建数据文件的使用非持久数据让其真正意义上的持久ScriptableObject的应用配置数据复用数据数据带来的多态行为单例模式化的获取数据 ScriptableObject 概述 ScriptableObject是什么 ScriptableObject是Unity提供的一个…

Windows抛弃历史包袱:可能带来哪些改善?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 Windows的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;性能提升固然重要&#xff0…

[NSSCTF]-Reverse:[HUBUCTF 2022 新生赛]simple_RE(base64换表)

无壳 查看ida 可以看得出是base64&#xff0c;而且是换表的。 完整exp&#xff1a; import base64 result5Mc58bPHLiAx7J8ocJIlaVUxaJvMcoYMaoPMaOfg15c475tscHfM/8 biaostr.maketrans(qvEJAfHmUYjBacu8Ph5n9Od17FrICL/X0gVtM4Qk6T2z3wNSsyoebilxWKGZpRD,ABCDEFGHIJKLMNOPQR…

BUUCTF---misc---[SWPU2019]我有一只马里奥

1、下载附件是一个.exe文件 2、运行之后可以看到桌面生成了1.txt文件&#xff0c;文件里面有如下内容 3、经过信息搜索&#xff1a;NTFS&#xff08;New Technology File System&#xff09;是一种由Microsoft开发的专有日志文件系统。根据它的提示&#xff0c;应该是把flag.tx…