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…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...