C++面向对象的常见面试题目(二)

1. 继承关系下,析构函数和构造函数执行顺序?

构造函数按照依赖链,从强到弱构造

首先调用基类的构造函数。如果有多个基类,则按照它们在派生类声明中出现的顺序调用;接下来,按照它们在类中声明的顺序,调用派生类中所有非静态成员变量(包括从基类继承的成员变量)的构造函数;最后调用派生类自己的构造函数体。这意味着,派生类的构造函数有机会使用已经初始化完毕的基类成员和派生类成员。

析构函数按照依赖链,从弱往强进行析构

首先执行派生类的析构函数体;然后按照它们在类中声明的逆序,调用派生类中所有非静态成员变量的析构函数;最后调用基类的析构函数;如果有多个基类,同样按照它们在派生类声明中逆序调用。

2. 虚函数表和虚函数表指针的创建时机

编译器发现类中包含 virtual 关键字修饰的函数就会创建虚函数表。虚函数表的内容在编译的时候就已经生成了。虚函数表存储在全局数据区的只读数据字段中,虚函数表是存放虚函数的地址的数组。

当一个包含虚函数的类的对象被创建时,编译器会确保在对象的内存布局中包含一个指向虚函数表的指针,即vptr。vptr的初始化(即赋值为虚函数表的地址)通常发生在对象构造函数执行的过程中。即使没有显示定义构造函数,编译器也会自动生成一个默认构造函数来完成这项任务。

在继承关系中,调用基类构造函数的时候,先将基类的虚函数表地址赋值给 vptr,接着调用子类构造函数的时候,又将子类的虚函数表地址赋值给 vptr。

3. 虚析构函数的作用

虚析构函数是在C++中,为了实现多态性而在基类中声明为虚函数的析构函数。

在继承下,为了使子类析构函数能得到正常调用,需要将基类的析构函数设置为虚析构函数。

设置虚析构函数是有代价的,编译器会为类生成虚函数表,每个对象都需要持有 vptr

4. 手动管理指针可能出现哪些问题?

野指针:指向了一个未知的、无效的或者未初始化的地址

指针悬挂:释放了内存但是忘记把指针置空

踩内存:程序在运行过程中发生了越界

没有释放资源产生内存泄漏,重复释放资源引发coredump

5. C++智能指针的原理

unique_ptr: 代表独占所有权的智能指针。它保证同一时间内只有一个unique_ptr实例拥有指向对象的指针。当unique_ptr离开作用域时,它会自动删除所拥有的对象,从而释放内存

shared_ptr: 引用计数,允许多个智能指针共享同一个对象的所有权。它通过引用计数机制工作,即一个控制块(通常是一个原子计数器)记录有多少个shared_ptr指向同一块内存。当最后一个指向该内存的shared_ptr销毁时,引用计数减至零,此时控制块会自动释放这块内存。

weak_ptr: 一种不增加引用计数的智能指针,它用于非拥有地观察由一个或多个shared_ptr管理的对象。主要用于解决循环引用的问题,因为weak_ptr不会增加被观察对象的引用计数,即使持有weak_ptr的实例很多,也不会阻止对象被销毁。

6. 静态库和动态库的区别

(1)链接方式:静态链接把静态库编译到目标文件;动态链接没有把库编译到目标文件,而是在程序运行时才去加载代码

(2)空间占用:静态库会存在多个副本,动态库只有一个副本

(3)使用方式:静态库 程序直接运行,动态库需要根据指定的路径查找动态库

(4)执行速度:动态库执行慢,静态库执行速度较快

(5)库文件发生变更:接口变更都需要重新编译,接口实现改变如果是动态链接只需要重新编译动态库。

7. 使用过C++11哪些新特性

新的语法糖:auto, decltype, nullptr, final, override, const, 基于范围的for循环,function函数对象

 STL容器:vector、list、unordered_ma、unordered_set

智能指针:shared_ptr, weak_ptr, unique_ptr

多线程:thread、mutex、lock_guard、condition_variable、atomic

右值引用:T &&;实现移动语义和完美转发

8. 左值引用和右值引用的区别?右值引用的意义?

左值可以在等号左边,能够取地址,有一个具体的名字,右值只能在等号右边,不能取地址,不具名。

左值常见例子:变量名,返回左值引用的函数调用,前置自增自减,解引用表达式

右值常见例子:字面值,返回非引用类型的函数调用,后置自增自减,算数表达式,逻辑表达式,比较表达式,将亡值

右值引用的意义:避免资源的复制,实现资源所有权的转移,在模板编程中,右值引用和模板参数的结合使用可以实现完美转发(perfect forwarding),允许将函数参数以原始类型(左值或右值)转发给其他函数。

10. 什么是将亡值?

指的是即将被销毁的对象。这个概念是在C++11标准中引入的,用于描述那些即将被移动(move)操作所消费的对象。移动操作是一种优化技术,它允许将资源(如内存、文件句柄等)从一个对象转移到另一个对象,而无需复制这些资源。

这是一条吃饭博客,由挨踢零声赞助。学C/C++就找挨踢零声,加入挨踢零声,面试不挨踢!

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

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

相关文章

windows USB 设备驱动开发-处理批传输的静态流

在 USB 2.0 和更早版本的设备中,批量端点可以通过该端点发送或接收单个数据流。 在 USB 3.0 设备中,批量端点能够通过该端点发送和接收多个数据流。 Windows 中 Microsoft 提供的 USB 驱动程序堆栈支持多个流。 这使客户端驱动程序能够将独立的 I/O 请求…

GEE代码实例教程详解:长时间序列风速分析

简介 在本篇博客中,我们将使用Google Earth Engine (GEE) 对长时间序列的风速数据进行分析。通过ERA5再分析数据集,我们可以计算2010年至2024年间的平均风速,并与1980年至2020年的风速数据进行比较。 背景知识 ERA5数据集 ERA5是ECMWF&am…

代码随想录-Day53

739. 每日温度 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1: …

【Linux】目录的相关命令——cd,pwd,mkdir,rmdir

1.相对路径与绝对路径 在开始目录的切换之前,你必须要先了解一下所谓的路径(PATH),有趣的是:什么是相对路 与绝对路径? 绝对路径:路径的写法“一定由根目录/写起”,例如:/usr/shar…

Java版Flink使用指南——定制RabbitMQ数据源的序列化器

大纲 新建工程新增依赖数据对象序列化器接入数据源 测试修改Slot个数打包、提交、运行 工程代码 在《Java版Flink使用指南——从RabbitMQ中队列中接入消息流》一文中,我们从RabbitMQ队列中读取了字符串型数据。如果我们希望读取的数据被自动化转换为一个对象&#x…

Linux C++ 043-机房预约系统

Linux C 043-机房预约系统 本节关键字:Linux、C、机房预约系统 相关库函数:for_each、open、close、write 系统简介 学校现在有几个规格不同的机房,由于使用经常出现撞车现象,现开发一套机房预约系统,解决这一问题。…

Java进阶---抽象方法abstract

抽象方法 案例引入: 在某个宠物店的宠物资源管理系统中有: 狗类:属性(姓名),行为(吃饭) 猫类:属性(姓名),行为(吃饭)利用…

智慧科技照亮水利未来:深入剖析智慧水利解决方案如何助力水利行业实现高效、精准、可持续的管理

目录 一、智慧水利的概念与内涵 二、智慧水利解决方案的核心要素 1. 物联网技术:构建全面感知网络 2. 大数据与云计算:实现数据高效处理与存储 3. GIS与三维可视化:提升决策支持能力 4. 人工智能与机器学习:驱动决策智能化 …

LibreOffice的国内镜像安装地址和node.js国内快速下载网站

文章目录 1、LibreOffice1.1、LibreOffice在application-conf.yml中的配置2、node.js 1、LibreOffice 国内镜像包网址:https://mirrors.cloud.tencent.com/libreoffice/libreoffice/ 1.1、LibreOffice在application-conf.yml中的配置 jodconverter:local:enable…

Java面试八股之MySQL中int(10)和bigint(10)能存储读的数据大小一样吗

MySQL中int(10)和bigint(10)能存储读的数据大小一样吗 在MySQL中,int(10)和bigint(10)的数据存储能力并不相同,尽管括号内的数字(如10)看起来似乎暗示着某种关联,但实际上这个数字代表的是显示宽度,而不是…

vue学习day03-指令修饰符、v-bind对于样式控制的增强、v-model应用于其他表单元素

7、指令修饰符 (1)概念: 通过“.”指明一些指令后缀,不同后缀封装了不同的处理操作->简化代码 (2)按键修饰符 keyup.enter->键盘回车监听 (3)v-model修饰符 v-model.tri…

vue + element ui 实现侧边栏导航栏折叠收起

首页布局如下 要求点击按钮,将侧边栏收缩, 通过 row 和 col 组件&#xff0c;并通过 col 组件的 span 属性我们就可以自由地组合布局。 折叠前 折叠后 <template><div class"app-layout" :class"{ collapse: app.isFold }"><div class&…

Onekey正版steam分流下载工具

今天给大家介绍的是一款下载steam游戏的工具。Onekey工具&#xff0c;是一款游戏下载器&#xff0c;可以下载steam正版分流游戏。下载正版分流的网站很多&#xff0c;但是都是网盘或者迅雷下载&#xff0c;或者游戏盒子下载&#xff0c;速度都很慢。这款软件是用steam下载的&am…

Flask项目搭建及部署 —— Python

flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、创建flask项目&#xff1a; 创建完成后整个项目结构树&#xff1a; app.py: 项⽬管理⽂件&#xff0c;通过它管理项⽬。 static: 存放静态…

自定义控件视图篇(一)测量与布局

在自定义控件的开发过程中&#xff0c;"视图篇"的测量与布局是非常关键的步骤&#xff0c;这直接决定了控件的尺寸、位置以及子视图的排列方式。下面我将详细介绍测量和布局的过程&#xff0c;以及如何在自定义控件中正确实现这些步骤。 视图的测量 (onMeasure) 在…

2021版本的idea热部署的详细步骤

背景&#xff1a;我是自己用的是2021版本的idea,然后发现跟2023版本的热部署不太一样&#xff0c;所以&#xff0c;今天自己出一期这样的文章吧&#xff01;&#xff01;&#xff01;其他人配置的时候根据自己的情况&#xff0c;来阅读吧&#xff01; 第一步&#xff1a;方式一…

MyBatis是如何分页的及原理

MyBatis 是一种持久层框架&#xff0c;支持通过配置文件和注解将 SQL 映射为 Java 对象。在实际开发中&#xff0c;查询数据时经常需要进行分页处理。 MyBatis 也提供了支持分页的方案&#xff0c;其主要思路是使用 Limit 偏移量和限制个数&#xff0c;来获取指定数量的数据。下…

音视频入门基础:H.264专题(10)——FFmpeg源码中,存放SPS属性的结构体和解码SPS的函数分析

一、引言 FFmpeg源码对AnnexB包装的H.264码流解码过程中&#xff0c;通过ff_h2645_extract_rbsp函数拿到该H.264码流中的某个NALU的NALU Header RBSP后&#xff08;具体可以参考&#xff1a;《FFmpeg源码&#xff1a;ff_h2645_extract_rbsp函数分析》&#xff09;&#xff0c…

【沐风老师】3DMAX建筑体块生成插件BuildingBlocks使用方法详解

BuildingBlocks建筑体块生成插件使用方法详解 听说你还在手动建配景楼&#xff1f;有了BuildingBlocks这个插件&#xff0c;一分钟搞定喔&#xff01; 3DMAX建筑体块生成插件BuildingBlocks&#xff0c;用于快速自定义街道及生成配景楼区块。 【适用版本】 3dMax2019及更高版…

空间分析在3D应用中的革命:提升投资回报与业务价值

在3D应用的浪潮中&#xff0c;空间分析技术正成为提升用户体验、优化业务决策和解决复杂问题的关键工具。本文将深入探讨空间分析如何通过提供深度用户行为洞察和数据可视化&#xff0c;增强3D应用的实际效益和市场竞争力。 一、空间分析的概念与背景 Tony Bevilacqua&#x…