当前位置: 首页 > news >正文

经典面试题:C/C++中static关键字的三大核心作用与实战应用

一、修饰局部变量:改变生命周期,保留跨调用状态

核心作用

  1. 延长生命周期:将局部变量从栈区移至静态存储区(数据段或BSS段),生命周期与程序一致
  2. 保留状态:变量在函数多次调用间保持值不变,适用于计数器、状态缓存等场景

底层原理:

  • 存储位置:普通局部变量存储在栈区,函数结束即释放;static局部变量存储在静态区,程序启动时分配内存
  • 初始化:仅首次执行初始化,后续调用直接复用当前值

示例代码

void func() {  static int count = 0;  // 首次初始化,后续不再执行  count++;  cout << "调用次数:" << count << endl;  
}  
// 输出:1, 2, 3...(每次调用保留上次结果)  

面试高频问题

  • “static局部变量和全局变量有什么区别?”
    • :作用域不同(局部变量仍限制在函数内),但生命周期相同;全局变量可被其他函数访问,static局部变量仅限当前函数

二、修饰全局变量与函数:限制作用域,实现模块化封装

核心作用

  1. 隐藏性
    • 全局变量static修饰后仅在当前文件可见,避免多文件同名变量冲突
    • 函数:限制函数作用域为当前文件,防止外部调用(类似C++的匿名命名空间)
  2. 模块化设计:将变量和函数封装为模块私有资源,提升代码安全性和可维护性

底层原理

  • 链接属性:普通全局变量/函数为外部链接(extern),static修饰后变为内部链接,仅当前编译单元可见

示例代码

// file1.cpp  
static int config = 100;  // 仅当前文件可见  
static void init() { /* 私有逻辑 */ }  // 外部文件无法调用  // file2.cpp  
extern int config;  // 编译报错:无法访问  

面试高频问题

  • “如何避免多文件开发中的命名污染?”
    • :使用static修饰全局变量/函数,或通过命名空间(C++)隔离

三、修饰类成员:实现数据共享与无对象操作

核心作用​(C++特有):

  1. 共享数据:静态成员变量属于类而非对象,所有实例共享同一内存
  • 示例:类级别的计数器、配置参数池。
  1. 无对象调用:静态成员函数无this指针,可直接通过类名调用,适用于工具方法

底层原理

  • 存储位置:静态成员变量存储在全局静态区,类定义中仅声明,需在类外单独初始化
  • 访问限制:静态函数只能访问静态成员,不可直接操作非静态成员

示例代码

class Logger {  
public:  static int logCount;  // 声明  static void log(const string& msg) {  logCount++;  // 仅能访问静态成员  cout << msg << endl;  }  
};  
int Logger::logCount = 0;  // 类外初始化  // 使用:  
Logger::log("系统启动");  // 无需实例化  

面试高频问题

  • “静态成员变量为什么需要类外初始化?”
    • :类定义仅声明成员类型和大小,初始化需在全局作用域完成,避免重复定义

四、延伸考点与避坑指南
  1. 默认初始化为0
  • 静态变量(未显式初始化)会被编译器自动置零,适用于稀疏数据结构初始化优化
  1. const的联合使用
  • static const成员可在类内直接初始化(C++11后支持),常用于常量定义
  1. 多线程安全问题
  • 静态变量共享可能导致竞态条件,需通过锁或原子操作保护

总结与学习建议
  • 理解层次:从“生命周期→作用域→内存布局”逐层深入,结合反汇编工具观察变量地址变化
  • 实战应用
    • 模块化开发:用static隐藏内部实现(如SDK封装)
    • 性能优化:高频小函数用static局部变量替代全局变量,减少锁竞争
  • 扩展阅读
    • 《Effective C++》Item 4:静态变量初始化顺序问题
    • Linux内核源码:观察static在驱动模块中的应用

📦 硬核资料赠送

关注私信>>「C++王者」获取以下资源:

  1. 《C++后端开发高频八股文》
    涵盖23个核心考点,助你轻松应对面试!

  2. 《C/C++工程师能力自测清单》
    50+项技能树Checklist,快速定位技术短板!

  3. 【开源项目】libevent-master
    高性能网络库源码,深入理解事件驱动编程!

  4. 【开源项目】workflow-master
    现代C++异步任务调度框架,提升开发效率!

  5. 《LeetCode 101算法精讲》
    剑指Offer最优解合集,算法刷题必备神器!


关注我,获取更多C++硬核知识! 🚀

相关文章:

经典面试题:C/C++中static关键字的三大核心作用与实战应用

一、修饰局部变量&#xff1a;改变生命周期&#xff0c;保留跨调用状态 核心作用&#xff1a; ​延长生命周期&#xff1a;将局部变量从栈区移至静态存储区&#xff08;数据段或BSS段&#xff09;&#xff0c;生命周期与程序一致​保留状态&#xff1a;变量在函数多次调用间保…...

Linux固定IP方法(RedHat+Net模式)

1、查看当前网关 ip route | grep default 2、配置静态IP 双击重启 3、验证...

JVM 学习前置知识

JVM 学习前置知识 Java 开发环境层次结构解析 下图展示了 Java 开发环境的层级关系及其核心组件&#xff0c;从底层操作系统到上层开发工具&#xff0c;逐步构建完整的开发与运行环境&#xff1a; 1. 操作系统&#xff08;Windows, MacOS, Linux, Solaris&#xff09; 作用&…...

数据结构---图的深度优先遍历(DFS)

一、与树的深度优先遍历之间的联系 1.类似于树的先根遍历。 递归访问各个结点&#xff1a; 2.图的深度优先遍历 先设置一个数组&#xff0c;初始值全部设置为false&#xff0c;先访问一个结点&#xff0c;在用一个循环&#xff0c;依次检查和这个结点相邻的其他结点&#xff0c…...

QPrintDialog弹出慢的问题

开发环境 操作系统: openkylin2qt版本 : 5.15.10排查过程 首先看下问题的现象, 问题现象 复现问题的demo很简单,只能是从跟踪qt代码方面入手 void MainWindow::on_pushButton_clicked(){QPrinter printer;QPrintDialog dialog(&printer,this);dialog.exec();} 现在需要找一…...

QT-LINUX-Bluetooth蓝牙开发

BlueToothAPI QT-BlueToothApi Qt Bluetooth 6.8.2 官方提供的蓝牙API不支持linux。 D-Bus的API实现蓝牙 确保系统中安装了 BlueZ(版本需≥5.56),并且 Qt 已正确安装并配置了 D-Bus 支持。 默默看了下自己的版本.....D-BUS的API也不支持。 在 D-Bus 中,org 目录是 D-Bus…...

kvm虚拟机的基本使用

[rootkvm ~]# virsh destroy 虚拟机名 #关闭虚拟机 [rootkvm ~]# virsh undefine 虚拟机名 #删除虚拟机 [rootkvm ~]# virsh start 虚拟机名 #开启虚拟机 [rootkvm ~]# virsh console 虚拟机名 #登录虚拟机 [rootkvm ~]# virsh list --all …...

K8S中若要挂载其他命名空间中的 Secret

在Kubernetes&#xff08;k8s&#xff09;里&#xff0c;若要挂载其他命名空间中的Secret&#xff0c;你可以通过创建一个 Secret 的 ServiceAccount 和 RoleBinding 来实现对其他命名空间 Secret 的访问&#xff0c;接着在 Pod 中挂载这个 Secret。下面是详细的步骤和示例代码…...

【Java SE】抽象类/方法、模板设计模式

目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式&#xff08;抽象类使用场景&#xff09; 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法&#xff0c;需要声明&#xff0c;但是又不确定如何实现时&#xff…...

如何理解java中Stream流?

在Java中&#xff0c;Stream 是 Java 8 引入的一个强大API&#xff0c;用于处理集合&#xff08;如 List、Set、Map 等&#xff09;数据的流式操作。它提供了一种声明式、函数式的编程风格&#xff0c;可以高效地进行过滤、映射、排序、聚合等操作。 Stream 的核心概念 流&…...

QT编程之数据库开发

一、架构层次 ‌用户接口层‌ ‌QSqlQueryModel‌&#xff1a;管理SQL查询结果&#xff0c;提供表格数据模型用于展示‌‌QSqlTableModel‌&#xff1a;支持直接操作数据库表&#xff08;增删改查&#xff09;‌‌QSqlRelationalTableModel‌&#xff1a;支持带外键关联的复杂表…...

【10】高效存储MongoDB的用法

目录 一、什么是MongoDB 二、准备工作 &#xff08;1&#xff09;安装MongoDB ​&#xff08;2&#xff09;安装pymongo库 三、连接MongoDB 四、指定数据库 五、指定集合 六、插入数据 &#xff08;1&#xff09; insert 方法 &#xff08;2&#xff09;insert_one(…...

使用Qdrant等其他向量数据库时需要将将numpy 数组转换为列表 确保数据能被正确处理和序列化,避免类型不兼容的问题。

在使用Qdrant等其他向量数据库时需要 转换 numpy 数组为列表主要是为了确保数据能被正确处理和序列化&#xff0c;避免类型不兼容的问题。具体原因如下&#xff1a; 序列化兼容性&#xff1a; 很多数据库接口、API 或者 JSON 序列化工具只能处理 Python 的内置类型&#xff08;…...

mayfly-go开源的一站式 Web 管理平台

mayfly-go 是一款开源的一站式 Web 管理平台&#xff0c;旨在通过统一的界面简化 Linux 服务器、数据库&#xff08;如 MySQL、PostgreSQL、Redis、MongoDB 等&#xff09;的运维管理。以下从多个维度对其核心特性、技术架构、应用场景及生态进行详细解析&#xff1a; 一、核心…...

Linux中的yum和vim工具使用总结

在Linux系统管理和文本编辑中&#xff0c;yum和vim是两个非常重要的工具。yum作为包管理器帮助我们轻松安装和管理软件&#xff0c;而vim则是一个功能强大的文本编辑器。下面我将对这两个工具进行详细介绍。 一、YUM包管理器 1. YUM简介 YUM (Yellowdog Updater Modified) 是…...

笔记:代码随想录算法训练营day58:101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

学习资料&#xff1a;代码随想录 文中含大模型生成内容 101. 孤岛的总面积 卡码网&#xff1a;101. 孤岛的总面积 所以找周边都是水的陆地的方法就是找边缘的陆地然后删除它连同它的连通的陆地 深搜 #include <iostream> #include <vector> using namespac…...

Rust语言介绍和猜数字游戏的实现

文章目录 Rust语言介绍和猜数字游戏的实现cargo是什么使用Rust编写猜数字 Rust语言介绍和猜数字游戏的实现 Rust语言是一种系统编程语言&#xff0c;核心强调安全性、并发性以及高性能&#xff0c;由类似于C/C的底层控制能力&#xff0c;性能也非常接近&#xff0c;Rust有一些…...

高并发库存系统是否适合使用 ORM(Hibernate / MyBatis)

在设计高并发的库存管理系统时&#xff0c;数据层的选择至关重要。许多企业开发中习惯使用 ORM&#xff08;如 Hibernate、MyBatis&#xff09;来简化数据库访问&#xff0c;但在高并发、高吞吐的场景下&#xff0c;ORM 的适用性往往成为争议焦点。本文将探讨高并发库存系统是否…...

Spring Boot中接口数据字段为 Long 类型时,前端number精度丢失问题解决方案

Spring Boot中接口数据字段为 Long 类型时&#xff0c;前端number精度丢失问题解决方案 在Spring Boot中&#xff0c;当接口数据字段为 Long 类型时&#xff0c;返回页面的JSON中该字段通常会被序列化为数字类型。 例如&#xff0c;一个Java对象中有一个 Long 类型的属性 id …...

Java-servlet(七)详细讲解Servlet注解

Java-servlet&#xff08;七&#xff09;详细讲解Servlet注解 前言一、注解的基本概念二、Override 注解2.1 作用与优势2.2 示例代码 三、Target 注解3.1 定义与用途3.2 示例代码 四、WebServlet 注解4.1 作用4.2 示例代码 五、反射与注解5.1 反射的概念5.2 注解与反射的结合使…...

OpenCV Imgproc 模块使用指南(Python 版)

一、模块概述 imgproc 模块是 OpenCV 的图像处理核心&#xff0c;提供从基础滤波到高级特征提取的全流程功能。核心功能包括&#xff1a; 图像滤波&#xff1a;降噪、平滑、锐化几何变换&#xff1a;缩放、旋转、透视校正颜色空间转换&#xff1a;BGR↔灰度 / HSV/Lab 等阈值…...

PostgreSQL:简介与安装部署

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

流畅如丝:利用requestAnimationFrame优化你的Web动画体验

requestAnimationFrame 是前端开发中用于优化动画性能的 API。它允许浏览器在下一次重绘之前执行指定的回调函数&#xff0c;通常用于实现平滑的动画效果。 1.作用 优化性能&#xff1a;requestAnimationFrame 会根据浏览器的刷新率&#xff08;通常是 60Hz&#xff0c;即每秒…...

OpenCV 基础模块 Python 版

OpenCV 基础模块权威指南&#xff08;Python 版&#xff09; 一、模块全景图 plaintext OpenCV 架构 (v4.x) ├─ 核心层 │ ├─ core&#xff1a;基础数据结构与操作&#xff08;Mat/Scalar/Point&#xff09; │ └─ imgproc&#xff1a;图像处理流水线&#xff08;滤…...

代码随想录算法训练营第十五天 | 数组 |长度最小的子数组和螺旋矩阵II

长度最小的子数组 【题目简介】 【自写数组解法】 class Solution:def minSubArrayLen(self, target: int, nums: List[int]) -> int:minLength float(inf)slow 0fast 0cur_sum nums[slow]# 终止条件&#xff1a;fast不能超过最大索引值while slow < fast and fas…...

C++ 入门第27天:异常处理详细讲解

往期回顾&#xff1a; C 入门第24天&#xff1a;C11 多线程基础-CSDN博客 C 入门第25天&#xff1a;线程池&#xff08;Thread Pool&#xff09;基础-CSDN博客 C 入门第26天&#xff1a;文件与流操作基础-CSDN博客 C 入门第27天&#xff1a;异常处理详细讲解 前言 在 C 开发中…...

Powershell WSL导出导入ubuntu22.04.5子系统

导出Linux子系统 导出位置在C盘下,根据自己的实际情况更改即可Write-Host "export ubuntu22.04.5" -ForegroundColor Green wsl --export Ubuntu-22.04 c:\Ubuntu-22.04.tar 导入Linux子系统 好处是目录可用在任意磁盘路径,便于迁移不同的设备之间Write-Host &quo…...

中文文献去哪里查找,个人下载知网、万方、维普文献途径

国内三大知识库知网、万方、维普是查找中文文献常用数据库&#xff0c;本文将以实例演示个人下载这三个数据库文献的途径及过程。 先说下途径&#xff1a; 获取知网、万方、维普数据库资源可去文献党下载器网站&#xff1a; 使用方法&#xff1a; 在文献党下载器官网下载安装…...

玩转C#函数:参数、返回值与游戏中的攻击逻辑封装

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

简易shell

自主实现shell done&#xff0c;故意写成&#xff0c;表示先赋值&#xff0c;再判断&#xff0c;分割之后&#xff0c;strtok会返回NULL&#xff0c;刚好让gArgv最后一个元素是NULL&#xff0c;并且while判断结束 Makefile 1 myshell:myshell.c …...

注意力机制,本质上是在做什么?

本文以自注意机制为例&#xff0c;输入一个4*4的矩阵 如下&#xff1a; input_datatorch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ],dtypetorch.float) 得到Q和K的转置如下。 此时&#xff0c;计算QK^T ,得到如下结果 第一行第一个位置就是第一条样本和第…...

【机器学习-模型评估】

“评估”已建立的模型 在进行回归和分类时&#xff0c;为了进行预测&#xff0c;定义了预测函数fθ(x) 然后根据训练数据求出了预测函数的参数θ(即对目标函数进行微分&#xff0c;然后求出参数更新表达式的操作) 之前求出参数更新表达式之后就结束了。但是&#xff0c;其实我…...

19681 01背包

19681 01背包 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;动态规划、01背包 &#x1f4d6; &#x1f4da; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int N 10001…...

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测

Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测 目录 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量回归预…...

基于CAMEL 的Workforce 实现多智能体协同工作系统

文章目录 一、workforce 简介1.架构设计2.通信机制 二、workforce 工作流程图示例1.用户角色2.工作流程 三、workforce 中重要函数说明1.__init__函数2.add_single_agent_worker 函数3.add_role_playing_worker 函数4.add_workforce 函数 四、基于workforce实现多智能体协调&am…...

炫酷的3D按钮效果实现 - CSS3高级特性应用

炫酷的3D按钮效果实现 - CSS3高级特性应用 这里写目录标题 炫酷的3D按钮效果实现 - CSS3高级特性应用项目介绍核心技术实现1. 基础结构设计2. 视觉效果实现2.1 背景渐变2.2 立体感营造 3. 交互动效设计3.1 悬停效果3.2 按压效果 技术要点分析1. 深度层次感2. 动画过渡3. 性能优…...

AI视频是否会影响原创价值

AI视频是否会影响原创价值 AI视频带来全民创意对原创内容的影响 随着AI技术的发展&#xff0c;AI视频技术在视频领域的影响也逐渐凸显&#xff0c;从自动剪辑、特效生成到基于文本或语音自动生成视频内容&#xff0c;这一系列的进步极大地降低了视频制作的技术门槛与成本。这种…...

代码随想录刷题day50|(回溯算法篇)131.分割回文串▲

目录 一、回溯算法基础知识 二、分割回文串思路 2.1 如何切割 2.2 判断回文 2.3 回溯三部曲 2.4 其他问题 三、相关算法题目 四、总结 一、回溯算法基础知识 详见&#xff1a;代码随想录刷题day46|&#xff08;回溯算法篇&#xff09;77.组合-CSDN博客 二、分割回文…...

SpringCloud 学习笔记3(OpenFeign)

OpenFeign 微服务之间的通信方式&#xff0c;通常有两种&#xff1a;RPC 和 HTTP。 简言之&#xff0c;RPC 就是像调用本地方法一样调用远程方法。 在 SpringCloud 中&#xff0c;默认是使用 HTTP 来进行微服务的通信&#xff0c;最常用的实现形式有两种&#xff1a; RestTem…...

Python与区块链隐私保护技术:如何在去中心化世界中保障数据安全

Python与区块链隐私保护技术:如何在去中心化世界中保障数据安全 在区块链世界里,透明性和不可篡改性是两大核心优势,但这也带来了一个悖论——如何在公开账本的同时保障用户隐私?如果你的交易记录对所有人可见,如何防止敏感信息泄露? Python 作为区块链开发中最受欢迎的…...

基于32单片机的无人机直流电机闭环调速系统设计

标题:基于32单片机的无人机直流电机闭环调速系统设计 内容:1.摘要 本文针对无人机直流电机调速需求&#xff0c;设计了基于32单片机的无人机直流电机闭环调速系统。背景在于无人机应用场景不断拓展&#xff0c;对电机调速精度和稳定性要求日益提高。目的是开发一套高精度、响应…...

QT 图表(拆线图,栏状图,饼状图 ,动态图表)

效果 折线图 // 创建折线数据系列// 创建折线系列QLineSeries *series new QLineSeries;// series->append(0, 6);// series->append(2, 4);// series->append(3, 8);// 创建图表并添加系列QChart *chart new QChart;chart->addSeries(series);chart->setTit…...

预测性维护:Ubuntu边缘计算机如何降低电梯故障率

在现代城市中&#xff0c;电梯作为垂直交通的重要工具&#xff0c;其运行状态直接关系到人们的出行安全和效率。传统的电梯监控系统往往依赖于中心化的数据处理&#xff0c;存在响应慢、数据量大、实时性差等问题。而边缘协议网关&#xff08;Edge Protocol Gateway&#xff09…...

MyBatis plus详解

核心功能 代码生成器 它能够依据数据库表结构&#xff0c;自动生成涵盖实体类、Mapper 接口、Mapper XML 文件、Service 接口与实现类等在内的基础代码。开发人员只需简单配置数据库连接信息、表名以及生成代码的相关参数&#xff0c;即可快速生成符合项目规范的基础代码&…...

【数据挖掘】数据预处理——以鸢尾花数据集为例

数据预处理——以鸢尾花数据集为例 一、实验手册&#xff08;一&#xff09;实验目的&#xff08;二&#xff09;实验原理&#xff08;三&#xff09;实验环境&#xff08;四&#xff09;实验步骤&#xff08;五&#xff09;实验报告要求 二、案例代码&#xff08;以鸢尾花数据…...

根据文件名称查询文件所在位置

在 Linux 中&#xff0c;根据文件名称查询文件所在位置主要通过命令行工具实现&#xff0c;以下是几种常用方法&#xff1a; --- ### **1. 使用 find 命令&#xff08;最灵活&#xff09;** find 命令可以递归搜索指定目录下的文件&#xff0c;支持按名称、类型、时间等条件过…...

记一次wsl2+docker无法运行的经历

前情提要 由于某个大创项目的需要和对猫娘机器人的迫切渴求&#xff08;bushi 需要在电脑里面安装docker desktop。由于电脑里面安装了wsl2环境 因此决定使用wsl2dockerdesktop的方式配置docker 遇到的问题 在像往常一样安装docker desktop并且启动时 提示错误&#xff1a; …...

XSS介绍通关XSS-Labs靶场

目录 XSS XSS的类型 1.存储型XSS&#xff08;PXSS&#xff09;&#xff1a; 2. 反射型XSS&#xff08;N-PXSS&#xff09;&#xff1a; 3. DOM型XSS&#xff1a; 4. 突变型XSS&#xff08;mXSS&#xff09;&#xff1a; 5. 通用型XSS&#xff08;UXSS&#xff09;&#x…...

枚举的定义及其使用

在Java中&#xff0c;enum&#xff08;枚举&#xff09;是一个特殊的类&#xff0c;用于表示一组常量。enum类型在Java中提供了一种类型安全的方式来定义常量&#xff0c;相比传统的常量&#xff08;如public static final变量&#xff09;&#xff0c;它更加简洁、类型安全&am…...

[特殊字符][特殊字符][特殊字符][特殊字符][特殊字符][特殊字符]壁紙 流光染墨,碎影入梦

#Cosplay #&#x1f9da;‍♀️Bangni邦尼&#x1f430;. #&#x1f4f7; 穹妹 Set.01 #后期圈小程序 琼枝低垂&#xff0c;霜花浸透夜色&#xff0c;风起时&#xff0c;微光轻拂檐角&#xff0c;洒落一地星辉。远山隐于烟岚&#xff0c;唯余一抹青黛&#xff0c;勾勒出天光水…...