Qt 每日面试题 -3
21、static和const的使用
static : 静态变量声明,分为局部静态变量,全局静态变量,类静态成员变量。也可修饰类成员函数。
有以下几类∶
-
局部静态变量 : 存储在静态存储区,程序运行期间只被初始化一次,作用域仍然为局部作用域,在变量定义的函数或语句块中有效,程序结束时由操作系统回收资源。
-
全局静态变量︰ 存储在静态存储区,静态存储区中的资源在程序运行期间会一直存在,直到程序结束由系统回收。未初始化的变量默认为0,作用域在声明他的文件中有效。
-
类静态成员变量 : 被类的所有对象共享,包括子对象。必须在类外初始化,不可以在构造函数内进行初始化。
-
类静态成员函数 : 所有对象共享该函数,不含this指针,不可使用类中非静态成员。
const : 常量声明,类常成员函数声明。
-
const和static不可同时修饰类成员函数
-
const修饰成员函数表示不能修改对象(变量类型)实例的状态
(static表示该函数与类(变量类型)的实例没有关系,所以const 与static不能同时使用) -
const修饰变量时表示变量不可修改,修饰成员函数表示不可修改任意成员变量
22、指针和引用的异同
指针∶是一个变量,但是这个变量存储的是另一个变量的地址,我们可以通过访问这个地址来修改变量。
引用∶是一个别名,还是变量本身。对引用进行的任何操作就是对变量本身进行的操作。
-
相同点∶二者都可以对变量进行修改。
-
不同点∶
- 1指针可以不必须初始化,引用必须初始化。
- 2指针可以有多级,但是引用只有一级( int&& a不合法,int** p合法)。
- 3指针在初始化后可以改变,引用不能进行改变。
- 4 sizeof指针可以得到指针本身大小,sizeof引用得到的是变量本身大小。
- 5 指针传参还是值传递,引用传参传的是变量本身。
23、常用数据结构
vector :向量,连续存储,可随机访问。
deque :双向队列,连续存储,随机访问。
list :链表,内存不连续,不支持随机访问。
stack :栈,不可随机访问,只允许再开头增加/删除元素。
queue :单向队列,尾部增加,开头删除。
set :集合,采用红黑树实现,可随机访问。查找、插入、删除时间复杂度为O(logn)。
map :图,采用红黑树实现,可随机访问。查找、插入、删除时间复杂度为O(logn)。
hash_set:哈希表,随机访问。查找、插入、删除时间复杂读为O(1)。
24、谈一谈你对面向对象的理解
C++面向对象编程就是把事物都抽象成一个对象,用属性和方法来描述对象的信息。比如定义一个猫对象,猫的眼睛、毛发、嘴巴就可以定义为猫对象的属性,猫的叫声和走路就可以定义为猫对象的方法。
用对象的方式编程,不仅方便了程序员,也使得代码的可复用性、可维护性变好。
C++面向对象的三大特性是封装、继承、多态。
25、什么场景下使用继承方式,什么场景下使用组合?
-
继承︰通过扩展已有的类来获得新功能的代码重用方法
-
组合︰新类由现有类的对象合并成的类的构造方式
使用场景:
- 如果二者存在一个"是"的天系,并且一个类要对另外一个类公开所有接口,那么继承是更好的选择
- 如果二者间存在一个“有"的关系,那么首选组合
- 如果没有找到及其强烈无法辩驳的使用继承的的理由的时候,一律使用组合。组合体现为现实层面,继承主要体现在扩展方面。如果并不需要一个类的所有东西,那么就不需要使用继承,使用组合更好。如果使用继承,那么必须所有的都继承,如果有的东西你不需要继承但是你继承了,那么这就是滥用继承。
26、如何理解多态
-
定义:同一操作作用于不同的对象,产生不同的执行结果。 C++多态意味着当调用虚成员函数时,会根据调用类型对象的实际类型执行不同的操作。
-
实现:通过虚函数实现,用virtual声明的成员函数就是虚函数,允许子类重写。声明基类的指针或者引用指向不同的子类对象,调用相应的虚函数,可以根据指针或引用指向的子类的不同从而执行不同的操作。
Overload(重载): 函数名相同,参数类型或顺序不同的函数构成重载。
Override (覆盖): 派生类覆盖基类用virtual声明的成员函数。
Overwrite(重写): 派生类的函数重写了与其同名的基类函数。
- 派生类的函数与基类函数同名,但是参数不同,此时,不论有无 virtual 关键字, 基类的函数将被overwrite(注意别与overload混淆)。
- 如果派生类的函数与基类的函数同名, 并且参数也相同, 但是基类没有virtual关键字,基类函数将被overwrite。(注意别与override混淆)
27、虚函数表
多态是由虚函数实现的,而虚函数主要是通过虚函数表实现的。如果一个类中包含虚函数,那么这个类就会包含一张虚函数表,虚函数表存储的每一项是一个虚函数的地址。该类的每个对象都会包含一个虚指针(虚指针存在于对象实例地址的最前面,保证虚函数表有最高的性能),需指针指向虚函数表。注意:对象不包含虚函数表,只有需指针,类才包含虚函数表,派生类会生成一个兼容基类的虚函数表。
28、分别写出饿汉和懒汉线程安全的单例模式
单例模式∶保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。根据单例对象创建时间,可分为两种模式∶懒汉模式 和 饿汉模式。
- 懒汉模式∶延迟加载,不到万不得已不会去实例化类,也就是说第一次用到类实例的时候才会实例化。
#include<iostream>
#include<mutex>
using namespace::std;
//懒汉模式一:多线程不安全
template<typename T>
class singleton
{
public:static T* getInstance(){if (instance_ == nullptr) {instance_ = new T();}return instance_;}singleton() = delete;singleton(const singleton&) = delete;singleton &operator=(const singleton&) = delete;private:static T* instance_;
};template <typename T>
T* singleton<T>::instance_ = nullptr;//懒汉模式二:多线程安全
template <typename T>
class singleton2
{
public:static T* getInstance(){if (instance_ == nullptr){mutex_.lock();if (instance_ == nullptr){instance_ = new T();}mutex_.unlock();}return instance_;}
private:singleton2() = delete;singleton2(const singleton2&) = delete;singleton2& operator=(const singleton2&) = delete;
private:static T* instance_;static mutex mutex_;
};template <typename T>
T* singleton2<T>::instance_ = nullptr;template <typename T>
mutex singleton2<T> ::mutex_;
class Printer
{friend class singleton<Printer>;friend class singleton2<Printer>;
private:Printer() = default;Printer(const Printer&) = delete;Printer& operator=(const Printer&) = delete;
public:void print(){cout << "Printer" << endl;}
};int main(int argc,char *argv[])
{singleton<Printer>::getInstance()->print();singleton2<Printer>::getInstance()->print();
}
- 饿汉模式∶在单例类定义的时候(即在main函数之前)就进行实例化。因为main函数执行之前,全局作用域的类成员变量instance_已经初始化,故没有多线程的问题。
#include <iostream>
#include <mutex>
using namespace::std;
//饿汉模式
template <typename T>
class singleton
{
private:singleton() = delete;singleton(const singleton&) = delete;singleton& operator=(const singleton&) = delete;
public:static T* getInstance(){return instance_;}
private:static T* instance_;
};template <typename T>
T* singleton<T>::instance_ = new T();class Printer
{friend class singleton<Printer>;
private:Printer() = default;Printer(const Printer&) = delete;Printer& operator=(const Printer&) = delete;
public:void print(){cout << "Printer" << endl;}
};int main(int argc, char* argv[])
{singleton<Printer>::getInstance()->print();
}
29、说出观察者模式类关系和优点
定义了对象之间一对多的依赖,令多个观察者对象同时监听某一个主题对象,当主题对象发生改变时,所有的观察者都会收到通知并更新。
优点︰
- 抽象耦合:在观察者和被观察者之间,建立了一个抽象的耦合,由于耦合是抽象的,可以很容易扩展观察者和被观察者。
- 广播通信:观察者模式支持广播通信,类似于消息传播,如果需要接收消息,只需要注册一下即可。
缺点︰
- 依赖过多:观察者之间细节依赖过多,会增加时间消耗和程序的复杂程度。这里的细节依赖指的是触发机制,触发链条,如果观察者设置过多,每次触发都要花很长时间去处理通知。
- 循环调用:避免循环调用,观察者和被观察者之间绝对不允许循环依赖,否则会触发二者之间的循环调用,导致系统崩溃。
30、说出代理模式类关系和优点
优点︰
- 代理模式能将代理对象与真实被调用的自标对象隔离。
- 一定程度上降低了系统的耦合度,扩展性好。
- 可以起到保护目标对象的作用。
- 可以对目标对象的功能增强。
缺点︰
- 代理模式会造成系统设计中类的数量增加。
- 在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
相关文章:

Qt 每日面试题 -3
21、static和const的使用 static : 静态变量声明,分为局部静态变量,全局静态变量,类静态成员变量。也可修饰类成员函数。 有以下几类∶ 局部静态变量 : 存储在静态存储区,程序运行期间只被初始化一次,作用域仍然为局部…...

TypeScript系列:第四篇 - typeof 与 keyof
在 TypeScript系列:第三篇 - 泛型 有提及 keyof 的使用。 本文将详细介绍 keyof 和 typeof 运算符的基本概念、应用场景以及如何结合使用它们来提高代码的类型安全性。 #mermaid-svg-bnMG6PMTxMI4iafc {font-family:"trebuchet ms",verdana,arial,sans-se…...

JDK8新增特性(值得收藏)
1.Lamdba表达式 就相当于要使用接口Lock就不需要再创建一个类去实现接口了,直接用Lambda表达式省略了在创建的那个类。 Lamdba表达式是什么? “->”,Lambda操作符或箭 头操作符,它将Lambda表达式分割为两部分。 左边:指Lam…...

MATLAB系列06:复数数据、字符数据和附加画图类
MATLAB系列06:复数数据、字符数据和附加画图类 6. 复数数据、字符数据和附加画图类6.1 复数数据6.1.1 复变量( complex variables)6.1.2 带有关系运算符的复数的应用6.1.3 复函数( complex function)6.1.4 复数数据的作…...

【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型
【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型 1. Clarke 变换的模型与仿真1.1 Clarke 变换1.2 Clarke 变换的仿真模型 2. Park 变换的模型与仿真2.1 Park 变换2.2 Park 变换的仿真模型 3. Simscape标准库变换模块3.1 abc to Alpha-Beta-Zero 模块3…...

CSAPP Attack Lab
个人感觉非常有意思的一个 Lab,涉及的知识面比较窄,主要关注 缓冲区溢出漏洞 这一个方面,并基于此进行代码攻击,体验一把做黑客的感觉,对应知识点为书中的 3.10 节内容。 这个 Lab 上手便给了我当头一棒,在…...

通信工程学习:什么是NFVI网络功能虚拟化基础设施层
NFVI:网络功能虚拟化基础设施层 NFVI(Network Functions Virtualization Infrastructure)即网络功能虚拟化基础设施层,是NFV(Network Functions Virtualization,网络功能虚拟化)架构中的一个重要…...

不在同一局域网怎么远程桌面?非局域网环境下,实现远程桌面访问的5个方法分享!
非局域网环境下,怎么远程桌面?还能做到吗? 在企业管理中,远程桌面访问已成为提高工作效率、实现跨地域协同工作的关键工具。 然而,当被控端与控制端不在同一局域网时,如何实现远程桌面连接成为了许多企业…...

SparkSQL-初识
一、概览 Spark SQL and DataFrames - Spark 3.5.2 Documentation 我们先看下官网的描述: SparkSQL是用于结构化数据处理的Spark模块,与基本的Spark RDD API不同。Spark SQL提供的接口为Spark提供了更多关于正在执行的数据和计算结构的信息。在内部&a…...

Go语言的垃圾回收(GC)机制的迭代和优化历史
Go语言的垃圾回收(GC)机制自Go语言发布以来经历了多次重要的迭代和优化,以提高性能和减少程序运行时的停顿时间。 以下是一些关键的版本和相应的GC优化: Go版本GC耗时情况主要改进点Go 1.0-1.4可能达到几百毫秒至秒级使用简单的标…...

thinkphp8 从入门到放弃(后面会完善用到哪里写到哪)
thinkphp8 从入门到放弃 引言 thinkphp* 大道至简一、 thinkphp8 安装安装Composerthinkphp 安装命令(tp-项目名称)多应用安装(一个项目不会只有一个应用)安装完文件目录如下本地部署配置伪静态好了项目可以run 二、架构服务(Service…...

对于电商跨境电商独立站中源代码建站和SaaS建站的区别
电商跨境电商独立站的搭建有多种方式,作为电商企业,搭建完全自主控制的电商独立站,对于电商企业的发展和运营有着至关重要的作用。下面推荐一个使用多年的跨境电商独立站系统源码,做简要介绍,据说前段时间火爆的Pandab…...

使用vite+react+ts+Ant Design开发后台管理项目(二)
前言 本文将引导开发者从零基础开始,运用vite、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈,构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导,文章旨在为开发者揭示如何利用这些技术…...

C++之 string(中)
C之 string string类对象的容量操作 resize 将有效字符的个数该成n个,多出的空间用字符c填充 虽然在string里用的不多,但是在vector里面常见 这里有三种情况: 1)resize小于当前的size 2)resize大于当前的size,小于capacity …...

双向链表的基本结构及功能实现
1.基本结构: 双向链表是一种链表数据结构,它由一系列节点组成,每个节点包含三个部分: (1).数据域:存储节点的数据 (2).前驱指针:指向前一个节点 (3).后驱指针:指向下一个节点 2.基本特性: 双向链接: 与单向链表…...

stm32定时触发软件中断
这里使用定时器作为延时,单位为秒,使用exti的软件触发方式,配置见代码,在main里进行触发软件中断 代码 #include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "misc.h" #include "…...

blender设置背景图怎么添加?blender云渲染选择
Blender是一款功能强大的3D建模软件,它以流畅的操作体验和直观的用户界面而闻名。使用Blender,你可以轻松地为你的3D模型添加背景图片。 以下是具体的操作步骤: 1、启动Blender:首先,打开Blender软件。访问添加菜单&a…...

MMD模型及动作一键完美导入UE5-Blender方案(三)
1、下载并安装blender_mmd_tools插件 1、下载并安装Blender,Blender,下载Blender3.6,下载太新的版本可能会跟blender_mmd_tools不匹配 2、github下载blender_mmd_tools:https://github.com/UuuNyaa/blender_mmd_tools/ 3、Edit->Preference->Add ons->Install F…...

网络安全自学入门:(超详细)从入门到精通学习路线规划,学完即可就业
很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习,最终也只是会无疾而终!黑客是一个大的概念,里面包含了许多方向,不同的方向需要学习的内容也不一样。 算上从学校开始学习,已经在网安这条路上走…...

如何在O2OA中使用ElementUI组件进行审批流程工作表单设计
本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计,O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操作。 在流程表单设计界面,可以在左边的工具栏找到Ele…...

三、LLM应用开发准备工作
LLM应用开发准备工作 开发基础开发工具大模型kxswkey的配置与使用工具推荐结语 开发基础 最好具备一定的Python开发基础,不需要特别深 如果不具备,可以先学习一下基础知识(概念),比如Python环境管理、包管理与使用、基…...

机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析
可解释性机器学习是指使机器学习模型的决策过程透明化,帮助用户理解模型如何得出特定结果。随机森林和 FastSHAP 是常用的工具,以下是对它们的简要解析和可视化方法。 随机森林 1. 概述 随机森林是一种集成学习方法,通过构建多个决策树并结…...

使用Assimp加载glb/gltf文件,然后使用Qt3D来渲染
文章目录 1.代码2.说明2.1.调用2.2.关于贴图 1.代码 ModelLoader.h #ifndef MODELLOADER_H #define MODELLOADER_H#include <QObject> #include <Qt3DRender> #include <QVector3D> #include <QGeometry>#include <assimp/Importer.hpp> #incl…...

vue实现左侧数据拖拽到右侧区域,且左侧数据保留且左侧数据不能互相拖拽改变顺序
一、案例效果 二、案例代码 封装左侧抽屉 DrawerSearch.vue<template><div><mtd-form :model="formDrawerSearch" ref="formCustom" inline><mtd-form-item><mtd-inputtype="text"v-model="formDrawerSearch.ho…...

人工智能与机器学习原理精解【21】
文章目录 SVM求两线段上距离最近的两个点问题描述:距离函数:解法:具体步骤:特别注意:示例代码 SVM思想的介入1. **SVM 的基本思想**超平面: 2. **分类间隔(Margin)**1. **分类间隔的…...

【MySQL 01】数据库基础
目录 1.数据库是什么 2.基本操作 数据库服务器连接操作 数据库和数据库表的创建 服务器,数据库,表关系 数据逻辑存储 3.MySQL架构 4.SQL分类 5.存储引擎 1.数据库是什么 mysql&&mysqld: mysql:这通常指的是 MySQL …...

C语言字符学习中级使用库解决问题
学习C语言中的字符处理,对于初学者来说,理解字符的基本概念以及如何进行操作是非常重要的。字符处理是指对单个字符或一组字符(字符串)的操作。为了更好地理解,下面从基础开始介绍,并结合一些常用的函数和示…...

网络管理:网络故障排查指南
在现代IT环境中,网络故障是不可避免的。快速、有效地排查和解决网络故障是确保业务连续性和用户满意度的关键。本文将详细介绍网络故障排查的基本方法和步骤,确保内容通俗易懂,并配以代码示例和必要的图片说明。 一、网络故障排查的基本步骤 确认故障现象 确认用户报告的故…...

Springboot常见问题(bean找不到)
如图错误显示userMapper bean没有找到。 解决方案: mapper包位置有问题:因为SpringBoot默认的包扫描机制会扫描启动类所在的包同级文件和子包下的文件。注解问题: 比如没有加mapper注解 然而无论是UserMapper所在的包位置还是Mapper注解都是…...

架构设计笔记-5-软件工程基础知识
知识要点 按软件过程活动,将软件工具分为软件开发工具、软件维护工具、软件管理和软件支持工具。 软件开发工具:需求分析工具、设计工具、编码与排错工具。 软件维护工具:版本控制工具、文档分析工具、开发信息库工具、逆向工程工具、再工…...