【C/C++随笔】static 的用法和作用

news2024/9/23 19:25:53

「前言」所有文章已经分类好,放心食用

「归属专栏」C语言 | C嘎嘎

「主页链接」个人主页

「笔者」枫叶先生(fy)

static 的用法和作用???

static作用:

  • 作用1修改存储方式:用 static 修饰的变量存储在静态区(数据段,静态区在 C++ 里喜欢叫数据段)
  • 作用2可见性:当编译多个文件使,所有未加 static 修饰的全局变量和函数,都具有全局可见性,但是使用了 static 修饰之后,修饰的全局变量和函数都只在当前文件可见
  • 作用3初始化:被static修饰的变量默认初始化为0(内置类型)

作用1补充:

用static修饰的变量,在程序开始运行时就已经初始化完成了,在 main 函数之前,并且只初始化一次

测试作用2:

// A.h
#include <iostream>
using namespace std;

static int a = 1;
static void func1() { cout << "A.h" << endl; }

// B.cpp
#include "A.h"

static int b = 2;
static void func2() { cout << "B.cpp" << endl; }

// C.cpp
#include "A.h"

static int c = 3;
static void func3() { cout << "C.cpp" << endl; }

int main()
{
	cout << a << endl; // true
	cout << b << endl; // 编译错误,b未定义
	cout << c << endl; // true

	func1(); // 编译错误,func1未定义
	func2(); // true
	func3(); // true
	
	return 0;
}

编译:
在这里插入图片描述
测试作用1:

#include <iostream>
using namespace std;

static int a;
int b;

int main()
{
	static int c;
	cout << a << endl;
	cout << b << endl;
	cout << c << endl;
	return 0;
}

编译运行
在这里插入图片描述

:全局变量也具备这个属性(默认初始化为0,对于内置类型),因为全局变量也存储在静态区(数据段)

static 用法:

  • 用法1:修饰局部变量。生命周期随进程,但是作用域没有发生改变,作用域还是限制在该变量所处的作用域
  • 用法2:修饰全局变量。生命周期随进程,修改了作用域,由全工程可见变成本文件可见
  • 用法3:修饰函数。与修饰全局变量相似,改变了作用域
  • 用法4:修饰类成员变量。生命周期随进程,该变量属于整个类,只有一份,属于所有对象所有;static 修饰的类成员变量只能在类外初始化,类内定义类外初始化
  • 用法5:修饰类成员函数。该函数属于整个类,不属于特定的对象,通过类对象调用,并且没有this指针,只能访问类内 static 修饰的变量
  • 用法6:static const 修饰变量。同用法1,2;但是所修饰的变量的值不能被改变
  • 用法7:static const 修饰类成员变量。生命周期随进程,该变量属于整个类,只有一份,属于所有对象所有;所修饰的变量的值不能被改变。但是类内可以初始化内置类型,其他类型需要类外初始化

一些用法在该文章测试,文章:链接

注意:static 修饰的类成员函数不能被virtual修饰,因为 static 修饰的类成员函数没有this指针

用法4测试

静态成员变量必须在类外定义,定义时不添加 static 关键字,类中只是声明

class A
{
private:
	static int _a;//声明
};
int A::_a = 0;//静态成员定义

int main()
{
	A aa;
	return 0;
}
// 运行 true

错误用法测试:

class A
{
private:
	static int _a = 1; // erroe
};

int main()
{
	A aa;
	return 0;
}
// 编译 false

编译报错:
在这里插入图片描述

用法7测试

类内可以初始化内置类型

class A
{
private:
	static const int _a = 1;
};

int main()
{
	A aa;
	return 0;
}
// 运行 true

其他类型需要类外初始化:

class A
{
private:
	static const string str = "aaa";
};

int main()
{
	A aa;
	return 0;
}
// 编译 false

在这里插入图片描述

正确用法:

class A
{
private:
	static const string str;
};

int main()
{
	A aa;
	return 0;
}
// 初始化:const 变量类型 类名::变量名
const string A::str = "aaa";
// 运行 true
「 作者 」 枫叶先生
「 更新 」 2024.3.3
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。

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

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

相关文章

牛客练习赛122

D:圆 正着求删除的最小代价不好做&#xff0c;采用逆向思维&#xff0c;求选择一些不相交的线段使得构成一个圆的代价尽量大&#xff0c;最后答案就是所有线段权值之和减去最大代价。 那么如何求这个最大代价呢&#xff1f;显然区间DP 老套路&#xff1a;破环成链&#xff0…

一文读懂DDoS,分享防御DDoS攻击的几大有效方法

DDoS攻击是目前最常见的网络攻击方式之一。其见效快、成本低的特点&#xff0c;使它深受不法分子的喜爱。每39秒就会发生一次新的网络攻击&#xff0c;全球每天大约发生23000次DDoS攻击。对于未受保护的企业来说&#xff0c;每次DDoS攻击的平均成本为20万美元。可见部署DDoS防御…

LabVIEW齿轮传动健康状态静电在线监测

LabVIEW齿轮传动健康状态静电在线监测 随着工业自动化的不断发展&#xff0c;齿轮传动作为最常见的机械传动方式之一&#xff0c;在各种机械设备中发挥着至关重要的作用。然而&#xff0c;齿轮在长期运行过程中易受到磨损、变形等因素影响&#xff0c;进而影响整个机械系统的稳…

二维码门楼牌管理系统技术服务:门牌编设规则详解

文章目录 前言一、门牌编设规则解读二、区间编号与分段编号策略三、多出入口建筑物的门牌编设 前言 随着城市化的快速推进&#xff0c;门楼牌管理成为城市管理中不可或缺的一环。二维码门楼牌管理系统的引入&#xff0c;不仅提升了管理的效率&#xff0c;也为市民提供了更为便…

poi-tl表格行循环(自定义复杂表头)

输入模板 注:集合使用{{xx}}进行标识(在其需要循环的上一行进行标识),[xx]中的内容表示集合中对象属性 public static void main(String[] args) throws IOException {Map<String, Object> map new HashMap<>();LoopRowTableRenderPolicy policy new LoopRowTab…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+图像缩放,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收HLS动态字符叠加输出应用本方案的SDI接收HLS多路视频…

【Web - 框架 - Vue】随笔 - 通过CDN的方式使用VUE 2.0和Element UI

通过CDN的方式使用VUE 2.0和Element UI - 快速上手 VUE 网址 https://cdn.bootcdn.net/ajax/libs/vue/2.7.16/vue.js源码 https://download.csdn.net/download/HIGK_365/88815507测试 代码 <!DOCTYPE html> <html lang"en"> <head><meta …

【论文阅读-PRIVGUARD】Day4:3节

3 PRIVANALYZER&#xff1a;强制执行隐私政策的静态分析 本节介绍PRIVANALYZER&#xff0c;这是一个用于强制执行由PRIVGUARD追踪的隐私政策的静态分析器**。我们首先回顾LEGALEASE政策语言&#xff0c;我们使用它来正式编码政策&#xff0c;然后描述如何静态地强制执行它们**…

【24最新版PythonPycharm安装教程】小白保姆级别安装教程

今天&#xff0c;我就来教大家一下&#xff0c;如何去安装Python&#xff01; 需要博主打包好的一键激活版Pycharm&&Python也可扫下方直接获取 ​ 1 了解Python Python是一种面向对象的解释型计算机程序设计语言&#xff0c;由荷兰人Guido van Rossum于1989年发明&…

调试工具vue,react,redux

React Developer Tools Redux DevTools Vue devtools 使用浏览器官方组件扩展搜索安装

阿克曼转向车型导航末段位姿调整控制

1目标 分析RPP算法时控制器算法学习1-RPP受控纯追踪算法发现,在终点时如果角度还有较大偏差,该算法无法进行很好的调整,故开始尝试在末端接近目标点时,用自己的控制算法去调整位姿,姑且命名为TEA算法(Target-End-Adjust Algorithm for Ackermann) 2控制思路 step1. 将…

nginx使用详解--缓存

Nginx 是一个功能强大的 Web 服务器和反向代理服务器&#xff0c;它可以用于实现静态内容的缓存&#xff0c;缓存可以分为客户端缓存和服务端缓存。 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个协商缓存的请…

C++入门07 数组、指针与字符串

图源&#xff1a;文心一言 听课笔记简单整理&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 第1版&#xff1a;听课的记录代码~&#x1f9e9;&#x1f9e9; 编辑&#xff1a;梅头脑&#x1f338; 审核&#xff1a;文心一言 目录 &#x1f433;课程来源 &#x1…

力扣hot5---双指针

题目&#xff1a; 解决方案&#xff1a;双指针 指针 i 指向最左侧&#xff0c;指针 j 指向最右侧。此时在宽度上达到了最大值&#xff0c;那么哪个柱子更矮&#xff0c;哪个柱子向内部移动&#xff0c;知道 i 与 j 相遇。为什么呢&#xff1f; 如果哪个哪个柱子更矮&#xff0c…

蓝凌EIS智慧协同平台 rpt_listreport_definefield.aspx SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 rpt_listreport_definefield.aspx接口处未对用户输入的SQL语句…

NOC2023软件创意编程(学而思赛道)python小高组决赛真题

目录 下载原文档打印做题: 软件创意编程 一、参赛范围 1.参赛组别:小学低年级组(1-3 年级)、小学高年级组(4-6 年级)、初中组。 2.参赛人数:1 人。 3.指导教师:1 人(可空缺)。 4.每人限参加 1 个赛项。 组别确定:以地方教育行政主管部门(教委、教育厅、教育局) 认…

Python自动化机器学习库之mindsdb使用详解

概要 在机器学习领域,构建和训练模型是一项复杂且耗时的任务。为了简化这个过程,提高效率,MindsDB库应运而生。MindsDB是一个开源的自动化机器学习框架,它旨在使机器学习变得更加易于使用,即使是对于非专业的数据科学家和开发人员也是如此。本文将深入探讨MindsDB库的基本…

为什么要通过知识产权实缴企业注册资本?

2024年7月1日起开始实施新《公司法》&#xff0c;规定公司注册资本需自公司成立之日起5年内缴足。因此&#xff0c;有很多企业选择在2024年7月1日前把注册资本缴足。为了减缓资金压力&#xff0c;很多企业选择通过知识产权实缴注册资本。下面&#xff0c;我们将深入探讨用知识产…

壹陆锋芒,韧性成长 | 博睿数据16周年庆典圆满落幕!

十六年栉风沐雨&#xff0c;收获累累硕果&#xff1b;十六年砥砺追梦&#xff0c;书写辉煌华章。 2月29日&#xff0c;博睿数据成立16周年庆典活动在珠海圆满落幕&#xff0c;全体员工齐聚一堂&#xff0c;共同见证博睿数据历经十六载&#xff0c;再启新征程的荣耀时刻&#x…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的的机械器件识别系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发先进的机械器件识别系统对于提高工业自动化水平和生产效率具有至关重要的意义&#xff0c;本篇博客详细介绍了如何利用深度学习构建一个机械器件识别系统&#xff0c;并且提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并结合了YOLOv7、YO…