嵌入式面试题 C/C++常见面试题整理_7

一.什么函数不能声明为虚函数?

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

1.为什么C++不支持普通函数为虚函数?普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。

2.为什么C++不支持构造函数为虚函数?

因为构造函数本来就是为了明确初始化对象成员才产生的,虚函数表的指针是在构造函数中初始化的,,主要是从语义上考虑,所以不支持。

3.为什么C++不支持内联成员函数为虚函数?

其实很简单,那内联函数就是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。(再说了,inline函数在编译时被展开,虚函数在运行时才能动态的邦定函数)。

4.为什么C++不支持静态成员函数为虛函数?这也很简单,静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他也没有要动态邦定的必要性。

5.为什么C++不支持友元函数为虚函数?
因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。

二.纯虚函数指的是什么?

纯虚函数是一种特殊的虚函数,格式一般如下

由于在很多情况下,基类中不能对虚函数给出有意义的实现,只能把函数的实现留给派生类。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但是动物本身生成对象不合情理,此时就可以将动物类中的函数定义为纯虚函数,如果基类中有纯虚函数,那么在子类中必须实现这个纯虚函数,否则子类将无法被实例化,也无法实现多态。
含有纯虚函数的类称为抽象类,抽象类不能生成对象。纯虚函数永远不会被调用,它们主要用来统一管理子类对象。

三.基类的构造函数/析构函数是否能被派生类继承?

基类的构造函数析构函数不能被派生类继承。

基类的构造函数不能被派生类继承,派生类中需要声明自己的构造函数。设计派生类的构造函数时,不仅要考虑派生类所增加的数据成员初始化,

也要考虑基类的数据成员的初始化。声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,需要调用基类构造函数完成。

基类的析构函数也不能被派生类继承,派生类需要自行声明析构函数。声明方法与一般(无继承关系时)类的析构函数相同,不需要显式地调用基类的析构函数,

系统会自动隐式调用。需要注意的是,析构函数的调用次序与构造函数相反。

四.初始化列表和构造函数初始化的区别?

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如:

Example::Example():ival(0),dva1(0.0){} //ival(0) 和dva1是类的两个数据成员

上面的例子和下面不用初始化列表的构造函数看似没什么区别:

Example::Example{ival = 0;dva7 =0.0;
}

的确,这两个构造函数的结果是一样的。但区别在于:上面的构造函数(使用初始化列表的构造函数显示的初始化类的成员;而没使用初始化列表的构造函数是对类的成员赋值,并没有进行显示的初始化。

初始化和赋值对内置类型的成员没有什么大的区别,像上面的任一个构造函数都可以。但有的时候必须用带有初始化列表的构造函数:

1.成员类型是没有默认构造函数的类。若没有提供显示初始化式,则编译器隐式使用成员类型的默认构造函数,若类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。

2.const成员或引用类型的员。因为const对象或引用类型只能初始化,不能对他们赋值.

五.C++中有那些情况只能用初始化列表,而不能用赋值?

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面都跟一个放在括号中的初始化式。

例如,Example:Example ival(o,dva(0.0),其中ival与dva是类的两个数据成员。

在C++语言中,赋值与初始化列表的原理不一样,赋值是删除原值,赋予新值,初始化列表开辟空间和初始化是同时完成的,直接给予一个值.

所以,在C++中,赋值与初始化列表的使用情况也不一样,只能用初始化列表,而不能用赋值的情况-般有以下3种:

1.当类中含有 const(常量)、reference(引用)成员变量时,只能初始化,不能对它们进行赋值。常量不能被赋值,只能被初始化,

所以必须在初始化列表中完成,C++的引用也一定要初始化,所以必须在初始化列表中完成。

2.派生类在构造函数中要对自身成员初始化,也要对继承过来的基类成员进行初始化当基类没有默认构造函数的时候,

通过在派生类的构造函数初始化列表中调用基类的构造函数实现。

3.如果成员类型是没有默认构造函数的类,也只能使用初始化列表。若没有提供显式初始化时,

则编译器隐式使用成员类型的默认构造函数,此时编译器尝试使用默认构造函数将会失败.

六.构造函数没有返回值,那么如何得知对象是否构造成功?

这里的“构造”不单指分配对象本身的内存,而是指在建立对象时做的初始化操作(如打开文件、连接数据库等)

因为构造函数没有返回值,所以通知对象的构造失败的唯一方法就是在构造函数中抛出异常。

构造函数中抛出异常将导致对象的析构函数不被执行,当对象发生部分构造时,已经构造完毕的子对象将会逆序地被析构。

七.C语言宏中的#和##的区别

区别

“#”:将其后面的宏参数进行字符串化操作。

“##”:在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。

例子一:

#include <stdio.h>
#define paster( n ) printf( "token" "#n" " = %d", token##n )
int main()
{int token9 = 10;paster(9);return 0;
}

paster(9)宏展开结果:

printf("token9 = %d", token9);

输出结果:

token9 = 10

例子二:

#define hehe(x,y) x##y
int main()
{char string[] = "hello world";printf("%s\n", hehe(str, ing));return 0;
}

输出结果:

hello world

八.在C语言中,为什么 static变量只初始化一次?

对于所有的对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。存放在静态区的变量的生命周期一般比较长,

它与整个程序“同生死、共存亡",所以它只需初始化一次。而auto变量,即自动变量由于它存放在栈区,一旦函数调用结束,就会立刻被销毁。

九.函数指针和指针函数的区别

函数指针(Function Pointer): 函数指针是指向函数的指针。通过函数指针,可以间接调用函数,这在实现回调机制和动态链接时非常有用。

指针函数(Pointer Function): 指针函数是返回类型为指针的函数。也就是说,该函数会返回一个指针,而这个指针可以指向某种类型的数据。

函数指针示例:

#include <stdio.h>// 定义两个简单的加法和乘法函数
int add(int a, int b) 
{return a + b;
}int multiply(int a, int b) 
{return a * b;
}int main() 
{// 定义一个指向函数的指针int (*operation)(int, int);// 将指针指向加法函数operation = add;printf("Addition: %d\n", operation(5, 3)); // 输出:Addition: 8// 将指针指向乘法函数operation = multiply;printf("Multiplication: %d\n", operation(5, 3)); // 输出:Multiplication: 15return 0;
}

指针函数示例:

#include <stdio.h>
#include <stdlib.h>
// 定义一个函数,返回指向int的指针
int* getArray(int size) 
{// 在堆上分配内存int *array = (int*)malloc(size * sizeof(int));for (int i = 0; i < size; i++) {array[i] = i + 1; // 初始化数组}return array; // 返回数组的指针
}// 主函数
int main() 
{int size = 5;// 获取数组的指针int *myArray = getArray(size);// 打印数组内容for (int i = 0; i < size; i++) {printf("%d ", myArray[i]);}printf("\n");// 释放分配的内存free(myArray);return 0;
}

十.在头文件中定义静态变量是否可行,为什么?

不可行,如果在头文件中定义静态变量,会造成资源浪费的问题,同时也可能引起程序错误。因为如果在使用了该头文件的每个C语言文件中定义静态变量,按照编译的步骤,

在每个头文件中都会单独存在一个静态变量,从而会引起空间浪费或者程序错误所以,不推荐在头文件中定义任何变量,当然也包括静态变量。

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

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

相关文章

【MySQL】深入了解索引背后的内部结构

目录 索引的认识&#xff1a; 作用&#xff1a; 索引的使用&#xff1a; 索引底层的数据结构&#xff1a; 哈希表 AVL树 红黑树 B树&#xff1a; B树&#xff1a; B树搜索&#xff1a; 索引的认识&#xff1a; 索引是数据库中的一个数据结构&#xff0c;用于加速查询…

数据库基础练习4(有关索引,视图完整解答)

建立需要的表 学生表 mysql> create table studnet(sno int primary key auto_increment,sname varchar(30) not null unique,ssex varchar(2) check (ssex男 or ssex女) not null ,sage int not null,sdept varchar(10) default 计算机 not null); Query OK, 0 rows affe…

最新版Node.js下载安装指定版本图文版教程(非常详细)

文字目录 1、什么是Node.js&#xff1f;2、什么是 npm&#xff1f;3、下载Node.js安装包4、详细安装步骤 1、什么是Node.js&#xff1f; Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它使 JavaScript 可以在服务器端运行。在 Node.js 出现之前&#…

Spring Boot Web 入门

目录 Spring Boot Web 是 Spring Boot 框架的一个重要模块&#xff0c;它简化了基于 Spring 的 Web 应用程序的开发过程。以下是一个 Spring Boot Web 项目的入门指南&#xff0c;涵盖了项目创建、代码编写、运行等关键步骤。 1. 项目创建 使用 Spring Initializr 使用 IDE …

深度解读 Docker Swarm

一、引言 随着业务规模的不断扩大和应用复杂度的增加,容器集群管理的需求应运而生。如何有效地管理和调度大量的容器,确保应用的高可用性、弹性伸缩和资源的合理分配,成为了亟待解决的问题。Docker Swarm 作为 Docker 官方推出的容器集群管理工具,正是在这样的背景下崭露头…

eggnog后kegg结果提取和注释

首先进入KEGG BRITE: KEGG Orthology (KO) 下载json文件 用python处理一下 import json import re import osos.chdir("C:/Users/fordata/Downloads/") with open("ko00001.json","r") as f:fj f.read()kojson json.loads(fj)with open(&qu…

qt6.8安装mysql8.0驱动

qt6.8安装mysql8.0驱动 qt6.8本身是不带mysql驱动。想要在qt里面使用mysql,还是比较麻烦的。需要自己编译驱动 首先下载qt源码&#xff0c;链接Index of /archive/qt/6.8/6.8.1/single 下载mysql对于驱动文件&#xff0c;链接是MySQL :: Download MySQL Connector/C (Archiv…

学习threejs,使用Lensflare模拟镜头眩光

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.Lensflare 二、&…

结构化表达(一):观点

目录 观点 一、观点明确 二、观点先行 三、观点先行适用范围 观点 一、观点明确 观点是指具有中心思想的一句话&#xff0c;或者称之为有灵魂的表达。 二、观点先行 如果有了明确的观点&#xff0c;并且说在前面&#xff0c;对方就会很容易记住你想表达的内容。 三、观…

Cortex-M异常处理深度解析:从HardFault到调试实战

文章目录 引言一、Cortex-M异常类型全景图二、关键寄存器:故障分析的“密码本”1. HardFault状态寄存器(HFSR, 0xE000ED2C)2. 可配置故障状态寄存器(CFSR, 0xE000ED28)3. 地址寄存器(BFAR/MMFAR)三、调试实战:从寄存器到代码定位四、自定义HardFault处理程序五、Keil与…

Retrieval-Augmented Generation,检索增强生成流程

RAG流程 用户输入接收 系统接收用户输入的查询问题或文本内容&#xff0c;例如“李白有哪些著名的作品&#xff1f;”用户输入可以通过自然语言处理&#xff08;NLP&#xff09;模型的输入端口或用户交互界面&#xff08;如聊天应用、搜索引擎输入框等&#xff09;接收。 查询…

【大模型】DeepSeek与chatGPT的区别以及自身的优势

目录 一、前言二、核心技术对比2.1 模型架构设计2.1.1 ChatGPT的Transformer架构2.1.2 DeepSeek的混合架构 2.2 训练数据体系2.2.1 ChatGPT的数据特征2.2.2 DeepSeek的数据策略 三、应用场景对比3.1 通用场景表现3.1.1 ChatGPT的强项领域3.2.2 DeepSeek的专项突破 3.3 响应效率…

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇&#xff1a;《RabbitMQ 从入门到精通&#xff1a;从工作模式到集群部署实战&#xff08;一&#xff09;》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…

低至3折,百度智能云千帆宣布全面支持DeepSeek-R1/V3调用

DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架 。 出品|产业家 新年伊始&#xff0c;百度智能云又传来新动作 。 2月3日百度智能云宣布&#xff0c; DeepSeek-R1和 DeepSeek-V3模型已在百度智能云千帆平台上架&#xff0c;同步推出超低价格方案&#xff0c;并…

STM32G0B1 ADC DMA normal

目标 ADC 5个通道&#xff0c;希望每1秒采集一遍&#xff1b; CUBEMX 配置 添加代码 #define ADC1_CHANNEL_CNT 5 //采样通道数 #define ADC1_CHANNEL_FRE 3 //单个通道采样次数&#xff0c;用来取平均值 uint16_t adc1_val_buf[ADC1_CHANNEL_CNT*ADC1_CHANNEL_FRE]; //传递…

在 Java 中使用 JDBC 连接数据库时,DriverManager 的主要作用是什么?请简要描述其工作原理。

在Java中使用JDBC&#xff08;Java Database Connectivity&#xff09;连接数据库时&#xff0c;DriverManager扮演着至关重要的角色。它主要负责以下几个方面的工作&#xff1a; 加载数据库驱动程序&#xff1a;DriverManager会根据配置或者自动发现机制加载合适的数据库驱动…

Java基础学习笔记-构造方法

### this ###### this关键字是什么&#xff1f; 可以出现在构造器方法中。 代表当前对象的地址。 谁调用了这个方法&#xff0c;this就代表谁。 this关键字是对一个对象的默认引用。每个实例方法内部都有一个this引用变量&#xff0c;指向调用这个方法的对象 因为this是在对象内…

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命

目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展&#xff0c;部分内容有删除&#xff0c;与原文会有…

OpenEuler学习笔记(二十一):搭建企业AI客户服务例子

在 OpenEuler 上搭建企业 AI 客服可以按照以下步骤进行&#xff0c;以下将以使用开源的 Rasa 框架作为 AI 客服核心&#xff0c;搭配前端界面展示为例&#xff1a; 1. 系统准备 1.1 安装 OpenEuler 确保你已经安装好了 OpenEuler 操作系统&#xff0c;可以从官方网站下载镜像…

Linux运维——文件内容查看编辑

文件内容查看编辑 一、Linux 文件内容查看编辑要点二、命令常见用法2.1、cat2.2、head2.3、tail2.4、more2.5、less2.6、sed2.7、vi2.8、grep 一、Linux 文件内容查看编辑要点 连接文件并打印到标准输出设备 - 使用 cat显示指定文件的开头若干行 - 使用 head显示指定文件的末尾…