c++八股文:c++面向对象

文章目录

  • 1.c++面向对象三大特性
  • 2.c++的三个访问修饰符
  • 3.多重继承
  • 4.重载与重写
  • 5.c++多态怎么实现
  • 6.成员函数/成员变量/静态成员函数/静态成员变量的区别
  • 7.构造函数和析构函数
  • 8.c++构造函数有几种
  • 9.什么是虚函数什么是虚函数表
  • 10.虚函数和纯虚函数的区别
  • 11.抽象类和纯虚函数
  • 12.虚析构
  • 13.为什么要虚析构,为什么不能虚构造
  • 14.那些函数不能被声明为虚函数
  • 15.浅拷贝和深拷贝的区别
  • 参考

1.c++面向对象三大特性

  • 面向对象:对象是指具体的某一个事物,这些事物的抽象就是类,类中包含数据(成员变量)和动作(成员方法)。
  • 面向对象的三大特性:
    • 封装:将具体的实现过程和数据封装成一个函数,只能通过接口进行访问,降低耦合性。
    • 继承:让某种类型对象获得另⼀个类型对象的属性和⽅法。
    • 多态:多态就是不同继承类的对象,对同一消息做出不同的响应,基类的指针指向或绑定到派生类的对象,使得基类指针呈现不同的表现方式。
      • 实现多态有两种⽅式
        覆盖(override): 是指⼦类重新定义⽗类的虚函数的做法
        重载(overload): 是指允许存在多个同名函数,⽽这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)

2.c++的三个访问修饰符

public 、 private 和 protected 。
这些修饰符决定了类中的成员对外部代码的可⻅和访问权限
  • public 修饰符⽤于指定类中的成员可以被类的外部代码访问。公有成员可以被类外部的任何代码(包括类的实例)访问。
  • private 修饰符⽤于指定类中的成员只能被类的内部代码访问。私有成员对外部代码是不可⻅的,只有类内部的成员函数可以访问私有成员。
  • protected 修饰符⽤于指定类中的成员可以被类的派⽣类访问。受保护成员对外部代码是不可⻅的,但可以在派⽣类中被访问。

3.多重继承

⼀个类可以从多个基类(⽗类)继承属性和⾏为。
在C++等⽀持多重继承的语⾔中,
⼀个派⽣类可以同时拥有多个基类。

多重继承可能引⼊⼀些问题,如菱形继承问题, ⽐如当⼀个类同时继承了两个拥有相同基类的类,⽽最终的派⽣类⼜同时继承了这两个类时, 可能导致⼆义性和代码设计上的复杂性。为了解决这些问题,C++ 提供了虚继承, 通过在继承声明中使⽤ virtual 关键字,可以避免在派⽣类中⽣成多个基类的实例,从⽽解决了菱形继承带来的⼆义性。


4.重载与重写

  • 重载:重载是指在同⼀作⽤域内,使⽤相同的函数名但具有不同的参数列表或类型,使得同⼀个函数名可以有多个版本。

  • 重写:重写是指派⽣类(⼦类)重新实现(覆盖)基类(⽗类)中的虚函数,以提供特定于派⽣类的实现。重写是⾯向对象编程中的多态性的⼀种体现,主要涉及基类和派⽣类之间的关系,⽤于实现运⾏时多态。

  • 区别

重写重载
范围重写发生在不同的类之间(子类和父类之间)重载发生在同一个类的内部
参数重写的函数的函数名、参数列表和返回值类型都需要和原函数相同,父类中被重写的函数需要有 virtual 修饰重载的函数需要与原函数有相同的函数名、不同的参数列表,不关注函数的返回值类型
vritual关键字必须有可以有,可以没有

5.c++多态怎么实现

  • 多态概念:多态就是不同继承类的对象,对同一消息做出不同的响应,基类的指针指向或绑定到派生类的对象,使得基类指针呈现不同的表现方式。在基类的函数前加上 virtual 关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。
  • 多态实现原理:多态是通过虚函数实现的,虚函数的地址保存在虚函数表中,虚函数表的地址保存在含有虚函数的类的实例对象的内存空间中。
  • 简单解释:当基类的指针指向派生类的对象时,通过派生类的对象的虚表指针找到虚函数表(派生类的对象虚函数表),进而找到相应的虚函数进行调用。

6.成员函数/成员变量/静态成员函数/静态成员变量的区别

  • 成员函数:

    • 成员函数是属于类的函数,它们可以访问类的成员变量和其他成员函数。
    • 成员函数可以分为普通成员函数和静态成员函数。
    • 普通成员函数使⽤对象调⽤,可以访问对象的成员变量。
    • 普通成员函数的声明和定义通常在类的内部,但定义时需要使⽤类名作为限定符。
  • 成员变量:

    • 成员变量是属于类的变量,存储在类的每个对象中。
    • 每个对象拥有⼀份成员变量的副本,它们在对象创建时分配,并在对象销毁时释放。
    • 成员变量的访问权限可以是 public 、 private 或 protected 。
  • 静态成员函数:

    • 静态成员函数属于类⽽不是对象,因此可以直接通过类名调⽤,⽽不需要创建类的实例。
    • 静态成员函数不能直接访问普通成员变量,因为它们没有隐含的 this 指针。
    • 静态成员函数的声明和定义也通常在类的内部,但在定义时需要使⽤类名作为限定符。
  • 静态成员变量:

    • 静态成员变量是属于类⽽不是对象的变量,它们在所有对象之间共享。
    • 静态成员变量通常在类的声明中进⾏声明,但在类的定义外进⾏定义和初始化。
    • 静态成员变量可以通过类名或对象访问。

7.构造函数和析构函数

  • 构造函数:构造函数是在创建对象时⾃动调⽤的特殊成员函数。它的主要⽬的是初始化对象的成员变量,为对象分配资源,执⾏必要的初始化操作。
  • 析构函数:析构函数是在对象⽣命周期结束时⾃动调⽤的特殊成员函数。它的主要⽬的是释放对象占⽤的资源、执⾏必要的清理操作。

8.c++构造函数有几种

  • 默认构造:没有任何参数的构造函数。如果⽤户没有为类定义构造函数,编译器会⾃动⽣成⼀个默认构造
    函数。默认构造函数⽤于创建对象时的初始化,当⽤户不提供初始化值时,编译器将调⽤默认构造函数。
  • 带参构造:接受⼀个或多个参数,⽤于在创建对象时传递初始化值。
  • 拷贝构造:⽤于通过已存在的对象创建⼀个新对象,新对象是原对象的副本。参数通常是对同类型对象的
    引⽤。
  • 委托构造函数:在⼀个构造函数中调⽤同类的另⼀个构造函数,减少代码重复。

9.什么是虚函数什么是虚函数表

  • 虚函数:C++中的虚函数的作⽤主要是实现了多态的机制。虚函数允许在派⽣类中重新定义基类中定义的函数,使得通过基类指针或引⽤调⽤的函数在运⾏时根据实际对象类型来确定。这样的机制被称为动态绑定或运⾏时多态。
    在基类中,通过在函数声明前⾯加上 virtual 关键字,可以将其声明为虚函数。派⽣类可以重新定义虚函数,如果派⽣类不重新定义,则会使⽤基类中的实现。

  • 虚函数表:虚函数的实现通常依赖于⼀个被称为虚函数表(虚表)的数据结构。每个类(包括抽象类)都有⼀个虚表,其中包含了该类的虚函数的地址。每个对象都包含⼀个指向其类的虚表的指针,这个指针被称为虚指针(vptr)。
    当调⽤⼀个虚函数时,编译器会使⽤对象的虚指针查找虚表,并通过虚表中的函数地址来执⾏相应的虚函数。这就是为什么在运⾏时可以根据实际对象类型来确定调⽤哪个函数的原因。


10.虚函数和纯虚函数的区别

  • 虚函数

    • 有实现: 虚函数有函数声明和实现,即在基类中可以提供默认实现。
    • 可选实现: 派⽣类可以选择是否覆盖虚函数。如果派⽣类没有提供实现,将使⽤基类的默认实现。
    • 允许实例化: 虚函数的类可以被实例化。即你可以创建⼀个虚函数的类的对象。
    • 调⽤靠对象类型决定: 在运⾏时,根据对象的实际类型来决定调⽤哪个版本的虚函数。
    • ⽤ virtual 关键字声明:虚函数使⽤ virtual 关键字声明,但不包含 = 0 。
  • 纯虚函数:

    • 没有实现: 纯虚函数没有函数体,只有函数声明,即没有提供默认的实现。
    • 强制覆盖: 派⽣类必须提供纯虚函数的具体实现,否则它们也会成为抽象类。
    • 禁⽌实例化: 包含纯虚函数的类⽆法被实例化,只能⽤于派⽣其他类。
    • ⽤ = 0 声明: 纯虚函数使⽤ = 0 在函数声明末尾进⾏声明。
    • 为接⼝提供规范: 通过纯虚函数,抽象类提供⼀种接⼝规范,要求派⽣类提供相关实现。

11.抽象类和纯虚函数

  • 抽象类:是不能被实例化的类,它存在的主要⽬的是为了提供⼀个接⼝,供派⽣类继承和实现。抽象类中可以包含普通的成员函数、数据成员和构造函数,但它必须包含⾄少⼀个纯虚函数。即在声明中使⽤ virtual 关键字并赋予函数⼀个 = 0 的纯虚函数。
  • 纯虚函数:是在抽象类中声明的虚函数,它没有具体的实现,只有函数的声明。通过在函数声明的末尾使⽤ = 0 ,可以将虚函数声明为纯虚函数。派⽣类必须实现抽象类中的纯虚函数,否则它们也会成为抽象类。

12.虚析构

虚析构函数是⼀个带有 virtual 关键字的析构函数。 主要作⽤是确保在通过基类指针删除派⽣类对象时,能够正确调⽤派⽣类的析构函数,从⽽释放对象所占⽤的资源。
通常,如果⼀个类可能被继承,且在其派⽣类中有可能使⽤ delete 运算符来删除通过基类指针指向的对象,那么该基类的析构函数应该声明为虚析构函数。


13.为什么要虚析构,为什么不能虚构造

虚析构函数允许在运⾏时根据对象的实际类型调⽤正确的析构函数,从⽽实现多态性。如果基类的析构函数不是虚的,当通过基类指针删除指向派⽣类对象的对象时,只会调⽤基类的析构函数,⽽不会调⽤派⽣类的析构函数。这可能导致派⽣类的资源未被正确释放,造成内存泄漏。

构造函数在对象的创建阶段被调⽤,对象的类型在构造函数中已经确定。因此,构造函数调⽤不涉及多态性,也就是说,在对象的构造期间⽆法实现动态绑定。虚构造函数没有意义,因为对象的类型在构造过程中就已经确定,不需要动态地选择构造函数。


14.那些函数不能被声明为虚函数

常⻅的不不能声明为虚函数的有:
普通函数(⾮成员函数),静态成员函数,
内联成员函数,构造函数,友元函数。

15.浅拷贝和深拷贝的区别

主要区别在于如何处理对象内部的动态分配的资源。
  • 深拷贝:该对象和原对象占用不同的内存空间,既拷贝存储在栈空间中的内容,又拷贝存储在堆空间中的内容。

  • 浅拷贝:该对象和原对象占用同一块内存空间,仅拷贝类中位于栈空间中的内容。

参考

Leetcodec++面试突破

代码随想录–最强八股文c++

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABAP - SALV教程05 添加页眉和页脚

先看看效果叭CL_SALV_TABLE提供了SET_TOP_OF_LIST方法设置页眉显示和SET_TOP_OF_LIST_PRINT方法设置页眉打印来实现添加页眉的目的。CL_SALV_TABLE提供了SET_END_OF_LIST方法设置页脚显示和SET_END_OF_LIST_PRINT方法设置页脚打印来实现添加页脚的目的。这个四个方法的传入参数…

Flutter异常上报及性能监控实现

1. 页面异常监测 在Flutter中,通常用FlutterError监测Flutter框架抛出的异常,用runZonedGuarded监测应用中用户代码异常。 class AppGuarded {run(Widget app) {//1. 用FlutterError监测flutter框架抛出的异常FlutterError.onError (FlutterErrorDetail…

STM32F4 HAL库串口死锁问题调试记录

文章目录 STM32F4 HAL库串口死锁问题调试记录调试方法结果分析解决方法一:方法二: STM32F4 HAL库串口死锁问题调试记录 使用方法:通过串口DMA固定周期向外发送数据,同时开启串口DMA接收用于接收其它板卡发来的数据。 问题&#x…

2024年,智慧文旅领航新时代,重塑旅行体验的未来篇章!

随着科技的飞速发展,智慧文旅正成为旅游行业的新宠,以其独特的魅力和无限可能,引领着旅行体验的全面升级。 2024年,智慧文旅火爆出圈,成为各界关注的焦点,为游客带来了前所未有的震撼与享受。 智慧文旅&a…

290.【华为OD机试】连续出牌数量(深度优先搜索DFS—JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

《猛兽派对》好玩吗值得买吗?苹果电脑也能装《猛兽派对》吗?猛兽派对好友通行证 动物派对 猛兽对战游戏

目录 一、《猛兽派对》好玩吗? 游戏玩法: 物理引擎: 关卡设计: 游戏特色: 评价: 荣誉: 二、苹果电脑也能装《猛兽派对》吗? 第1步:下载并安装CrossOver这款软件…

C语言---文件操作(1)

1.文件的打开和关闭 fopen有2个参数,第一个是文件的名字,第二个是打开的模式(例如是读文件还是写文件) (1)该文件夹下面没有data.txt文件,但是我执行了read操作,所以会显示这样的错误 (2&#…

『NLP学习笔记』图解GPT3(How GPT3 Works-Visualizations and Animations)

图解GPT3(How GPT3 Works-Visualizations and Animations) 文章目录 一. GPT-1 vs GPT-2 vs GPT-3 vs GPT-3.5 vs GPT-4二. GPT32.1. 训练动图2.2. 预测动图2.3. 代码生成示例三. 参考文章原作者主页:Jay Alammar原英文链接:How GPT3 Works - Visualizations and Animations …

ApplicationContext容器

ApplicationContext容器 1.概述 ApplicationContext接口代表了一个Spring容器,它主要负责实例化、配置和组装bean。ApplicationContext接口间接继承了BeanFactory接口,相较于BeanFactory一些基本的容器功能,ApplicationContext接口是在BeanFactory接口基础上进行了扩展,增…

SQL 术语:Join 中的 Build 和 Probe 是什么意思?

博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…

如何在Vue中实现事件处理?

Vue是一种流行的JavaScript框架,广泛应用于前端开发。在Vue中,事件处理是一个非常关键的概念,可以帮助我们实现用户与页面的交互,今天我们就来探讨一下如何在Vue中实现事件处理。 首先,让我们先了解一下在Vue中如何绑…

[pdf]《软件方法》强化自测题业务建模需求分析共191页,230题

潘加宇《软件方法》强化自测题业务建模需求分析共191页,230题,已上传CSDN资源。 在完成书中自测题基础上,进一步强化。 也可到以下地址下载: 资料http://www.umlchina.com/url/quizad.html 如果需要网盘提取码:uml…

【Python】1. 背景知识

认识 Python 计算机基础概念 什么是计算机? 很多老一辈的人, 管下面这个叫做计算机. 然鹅, 它只是 “计算器”, 和计算机是有很大区别的. 现在我们所说的计算机, 不光能进行算术运算, 还能进行逻辑判断, 数据存储, 网络通信等等功能,。 以至于可以自动的完成非常复杂的工作…

代码随想录day10(2)字符串:反转字符串Ⅱ (leetcode541)

题目要求:给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前…

Spring与Spring Boot:简化Java开发的革命性框架

Spring与Spring Boot:简化Java开发的革命性框架 摘要:本文将深入探讨Spring与Spring Boot两个在Java开发领域具有重要地位的框架。我们将了解它们的核心概念、区别、联系以及在实际项目中的应用。通过本文,您将更好地理解如何使用这两个框架…

Zookeeper4:Java客户端、应用场景以及实现、第三方客户端curator工具包

文章目录 Java连接Zookeeper服务端依赖代码使用 应用场景统一命名服务统一配置管理统一集群管理服务器节点动态上下线理解实现模拟服务提供者【客户端代码】-注册服务模拟服务消费者【客户端代码】-获取服务信息进行请求消费 软负载均衡分布式锁理解实现 生产集群安装N台机器合…

Java中的Collection

Collection Collection 集合概述和使用 Collection集合概述 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素 JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现 创建Collection集合的对象 多态的方式 具体的实现类ArrayList C…

leetcode - 71. Simplify Path

Description Given a string path, which is an absolute path (starting with a slash ‘/’) to a file or directory in a Unix-style file system, convert it to the simplified canonical path. In a Unix-style file system, a period ‘.’ refers to the current di…

MATLAB环境下基于熵的声纳图像分割算法

声纳图像作为准确获取水下信息的重要途径之一,在国防、军事、工程等方面发挥着巨大作用。然而,由于水声信道的复杂多变和声波本身的传播损失,声纳图像往往呈现出分辨率和对比度不高、噪声干扰严重、目标轮廓模糊等特点。 声纳图像的分割指的…

FCIS 2023网络安全创新大会:洞察前沿技术,探索安全新境界(附大会核心PPT下载)

随着信息技术的飞速发展,网络安全问题日益凸显,成为全球关注的焦点。作为网络安全领域的重要盛会,FCIS 2023网络安全创新大会如期而至,汇聚了全球网络安全领域的顶尖专家、学者、企业家和政策制定者,共同探讨网络安全的…