C++的static关键字

百度慧眼人口位置数据:从原理到实战的GIS处理全流程 本文详细解析百度慧眼人口位置数据的处理全流程,从基本原理到实战应用。通过空间网格划分、终端数量统计等技术手段,百度慧眼数据能准确反映人群分布特征。文章涵盖坐标系转换、核密度分析、热力图制作等GIS处理技巧,并分享商业选址、城市规划等典型业务场景的解决方案,帮助读者高效利用这一数据资源。 阅读详情


  C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。

一、面向过程设计中的static

1、静态全局变量

在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:

//Example 1
#include <iostream.h>
void fn();
static int n; //定义静态全局变量
void main()
{
	n=20;
	cout<<n<<endl;
	fn();
}

void fn()
{
	n++;
	cout<<n<<endl;
}
静态全局变量有以下特点:
  • 该变量在全局数据区分配内存;
  • 未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);
  • 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;  
静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的分布情况如下图:
 
代码区
全局数据区
堆区
栈区

  一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。细心的读者可能会发现,Example 1中的代码中将

	static int n; //定义静态全局变量
改为
	int n; //定义全局变量
程序照样正常运行。
的确,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:
  • 静态全局变量不能被其它文件所用;
  • 其它文件中可以定义相同名字的变量,不会发生冲突;

您可以将上述示例代码改为如下:

//Example 2
//File1
#include <iostream.h>
void fn();
static int n; //定义静态全局变量
void main()
{
	n=20;
	cout<<n<<endl;
	fn();
}

//File2
#include <iostream.h>
extern int n;
void fn()
{
	n++;
	cout<<n<<endl;
}
编译并运行Example 2,您就会发现上述代码可以分别通过编译,但运行时出现错误。 试着将
static int n; //定义静态全局变量
改为
int n; //定义全局变量
再次编译运行程序,细心体会全局变量和静态全局变量的区别。

2、静态局部变量

在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。

我们先举一个静态局部变量的例子,如下:

//Example 3
#include <iostream.h>
void fn();
void main()
{
	fn();
	fn();
	fn();
}
void fn()
{
	static n=10;
	cout<<n<<endl;
	n++;
}
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。
  但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。
  静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

静态局部变量有以下特点:

  • 该变量在全局数据区分配内存;
  • 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
  • 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
  • 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;

3、静态函数

  在函数的返回类型前加上static关键字,函数即被定义为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

静态函数的例子:

//Example 4
#include <iostream.h>
static void fn();//声明静态函数
void main()
{
	fn();
}
void fn()//定义静态函数
{
	int n=10;
	cout<<n<<endl;
}
定义静态函数的好处:
  • 静态函数不能被其它文件所用;
  • 其它文件中可以定义相同名字的函数,不会发生冲突;

二、面向对象的static关键字(类中的static关键字)

1、静态数据成员

在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员。先举一个静态数据成员的例子。

//Example 5
#include <iostream.h>
class Myclass
{
public:
	Myclass(int a,int b,int c);
	void GetSum();
private:
	int a,b,c;
	static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员

Myclass::Myclass(int a,int b,int c)
{
	this->a=a;
	this->b=b;
	this->c=c;
	Sum+=a+b+c;
}

void Myclass::GetSum()
{
	cout<<"Sum="<<Sum<<endl;
}

void main()
{
	Myclass M(1,2,3);
	M.GetSum();
	Myclass N(4,5,6);
	N.GetSum();
	M.GetSum();

}
可以看出,静态数据成员有以下特点:
  • 对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
  • 静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;
  • 静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
  • 因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;
  • 静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
    <数据类型><类名>::<静态数据成员名>=<值>
  • 类的静态数据成员有两种访问形式:
    <类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
    如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员 ;
  • 静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了;
  • 同全局变量相比,使用静态数据成员有两个优势:
  1. 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
  2. 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;
2、静态成员函数

   与静态数据成员一样,我们也可以创建一个静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。 普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。 下面举个静态成员函数的例子。

//Example 6
#include <iostream.h>
class Myclass
{
public:
	Myclass(int a,int b,int c);
	static void GetSum();/声明静态成员函数
private:
	int a,b,c;
	static int Sum;//声明静态数据成员
};
int Myclass::Sum=0;//定义并初始化静态数据成员

Myclass::Myclass(int a,int b,int c)
{
	this->a=a;
	this->b=b;
	this->c=c;
	Sum+=a+b+c; //非静态成员函数可以访问静态数据成员
}

void Myclass::GetSum() //静态成员函数的实现
{
//	cout<<a<<endl; //错误代码,a是非静态数据成员
	cout<<"Sum="<<Sum<<endl;
}

void main()
{
	Myclass M(1,2,3);
	M.GetSum();
	Myclass N(4,5,6);
	N.GetSum();
	Myclass::GetSum();
}

 

 

关于静态成员函数,可以总结为以下几点:

 

  • 出现在类体外的函数定义不能指定关键字static;
  • 静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
  • 非静态成员函数可以任意地访问静态成员函数和静态数据成员;
  • 静态成员函数不能访问非静态成员函数和非静态数据成员;
  • 由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
  • 调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
    <类名>::<静态成员函数名>(<参数表>)
    调用类的静态成员函数。

ROS下UR+Realsense相机进行手眼标定 手眼标定主要是用来确定相机坐标系和机械臂坐标系之间的转换关系,从而实现后续的抓取等任务。 阅读详情

相关推荐

LabVIEW面向对象编程:操作者框架入门实战

本文是LabVIEW面向对象编程中操作者框架的入门实战指南。针对传统“面条式代码”在复杂项目中的维护难题,文章通过创建操作者、定义消息与处理函数、在主VI中调用等步骤,详细演示了如何利用操作者框架构建模块化、易扩展的应用程序架构,有效管理并行任务。

f0g1h2的博客 589

C++ static关键字作用讲解

一、隐藏作用 指的是加static关键字的变量只在源文件cpp中起作用,无法在其中文件中被调用。 举例来说明: 分别创建两个cpp文件。一个是main函数所处的cpp 一个是自己定义的demo.cpp demo.cpp代码如下:里面主要是定义了一个char类型字符a和msg函数 #include "stdafx.h" char a ='a'; void msg(){ std::co...

MusicMan 1893

Camera metadata

Camera metadata

weixin_42136255的博客 2529

C++ static关键字作用

C++ static关键字作用 1.static修饰全局变量 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。 未加static的全局变量,在符号表中是global符号,其他目标文件可见,这样的符号是要参与符号解析的。加了static之后,是local符号,其他目标文件不可见,只在当前文件中可见,不参与符号解析过程。所以多个源文件可以定义...

ll148305879的博客 1万+

Unity类银河恶魔城学习记录1-10 PlayerWallJump源代码 P37

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考

Homura_的博客 1379

实战指南:将MediaPipe封装为Windows DLL,实现C++/C#高效调用

在计算机视觉和多媒体处理领域,跨平台框架为开发者提供了强大的算法模型和计算能力。其核心原理在于通过预训练的机器学习模型和优化的计算图,实现对图像、视频流中特定目标(如人脸、手势、姿态)的实时检测与分析。这项技术的价值在于能够将复杂的AI能力模块化,降低应用开发门槛。在实际工程实践中,为了突破特定语言生态的限制并优化部署流程,开发者常需将核心功能封装成独立的库。例如,将Google的MediaPipe框架封装为Windows动态链接库(DLL),就是一个典型的工程实践。此举能有效解决语言壁垒和部署简化问题,使

weixin_28691741的博客 360

C++之static关键字

有int a = 5;/*=======这是重点======*/#endifint main()print();程序说明:在test.h定义了一个int的变量a,我们想在main.cpp中输出这个a,使用gcc进行编译。可以看到是链接期间的错误,多重定义。我们分析下为什么会出现这个错误。首先明白程序编译的过程。将源代码编译为可执行文件有四个阶段:预处理——>编译——>汇编——>链接。define定义的替换,includemain.cpp中include了test.h,编译器会将。

qq_41596730的博客 1593

小曾WRF自学日记(3)渐入佳境 ——WRF实例-数据下载与WPS前处理

ww

weixin_46297571的博客 1480

java中static关键字的作用_C++ static关键字到底有什么作用

在文章开头先写总结吧,省的文章太长大家看的又晕。简单总结下来static关键字具有以下两点作用:改变变量的生命周期和限定作用域1、改变变量的生命周期我们都知道在函数中申明的局部变量在函数调用完成后即会被释放,但是由static申明的局部变量的生存周期是长于函数的,也就是说即使函数调用结束后该变量的内存也不会被释放。下面我们直接看代码:#include #include void func(){in...

weixin_39528697的博客 120

海思图像质量之HiPQTool调试

文章目录一. HiPQTool 界面二. 图像调试三. 将调试参数写入程序中 一. HiPQTool 界面 二. 图像调试 三. 将调试参数写入程序中

lzg2011的博客 2381

Python 爬虫实战:共享单车数据采集全流程与市场洞察深度剖析

本文介绍了如何利用Python爬虫技术获取和分析共享单车运营数据。文章从项目背景出发,详细阐述了系统架构设计,包括数据抓取、清洗存储、分析和可视化模块。通过Scrapy、BeautifulSoup等工具实现数据采集,使用Pandas进行数据清洗,并借助Matplotlib进行可视化分析。实战部分展示了爬虫代码示例和城市分布、使用频率等分析案例。最终指出数据驱动分析有助于了解行业现状和市场趋势,未来可结合机器学习等方法进行深入洞察。该技术方案为共享单车行业研究提供了有效的数据支持。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2232

C++中static关键字作用总结

1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可) 当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。 //a.c char a = 'A'; // global variable void msg() { printf("Hello\n"); } ...

Wang Bei的博客 6257

AgentScope 2.0 扩展开发完全指南:从中间件到模型适配器的深度实践

本文系统讲解 AgentScope 2.0 框架的五大扩展机制,涵盖中间件系统的洋葱模型与钩子设计、ChatModelBase 基类与多供应商适配器开发、工作空间(本地/Docker/E2B)的抽象接口与生命周期管理、凭据工厂与 MCP 协议集成、以及工具协议与存储后端扩展。文中提供完整的架构图、代码示例与故障排查指南,帮助开发者快速掌握 AgentScope 的插件化扩展体系。

program哲学 296

C++static关键字

面向过程(C 语言)①函数内 static 局部变量:生命周期全局,仅初始化一次,函数内私有②static 全局变量 /static 普通函数:作用域锁定当前文件,外部不可访问C++ 类中静态成员①静态成员变量:全类共享,存全局区,类外初始化,无对象也能访问②静态成员函数:无 this 指针,只能操作静态成员,通过类名直接调用3.单例模式①依靠「私有构造+静态对象指针+静态获取函数」, 限制全局仅存在一个实例。

2501_94041724的博客 1841

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C++中static关键字的作用

C++中的static关键字的作用总结 C++中的static的两种用法:一种是面向过程程序设计,第二种是面向对象程序设计。前者应用于普通变量和函数,不涉及类;后者涉及static在类中的作用。 1.面向过程设计中的static 1.1 静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: //Example 1 #incl...

一个勤奋的coder的博客 4029

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++ static关键字

C++ static关键字 static关键字可用于声明全局范围、命名空间范围和类范围的变量和函数。 静态变量还可在本地范围声明。 先介绍几个概念: 静态持续时间,在程序启动时分配对象或变量,并在程序结束时释放对象或变量。 外部链接,变量的名称在用于声明变量的文件的外部是可见的。 内部链接,名称在用于声明变量的文件的外部是不可见的。 默认情况下,在全局命名空间中定义的对象或变量具有静态持续时间和外部链接。 **static**关键字常用于以下情况: 在全局和/或命名空间范围 (在单个文件范

weixin_44966641的博客 2652

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C\C++static关键字的用法总结

static关键字的作用主要起隐藏作用 static关键字在C\C++中都可以修饰内置类型变量、函数 static修饰内置类型变量为静态变量: static修饰的内置类型变量分为静态全局变量和静态局部变量,静态变量内存分配在 .data段,生成的符号为local类型的符号,在链接阶段进行符号解析时不做处理。静态变量只初始化一次,未初始化的静态变量会默认初始化为0。静态全局变量只在本文件可见,...

magic_world_wow的博客 1万+

【C++ 】详解Static关键字

Static关键字用于声明变量或函数的存储期为整个程序的执行期间,即使它们的作用域是局部的。在C++中,static还可以用来定义类的静态成员。静态关键字在C++中提供了强大的工具,用于控制对象的可见性、生命周期和初始化。通过正确使用它们,可以写出更健壮、更易于维护的代码。然而,也需要注意静态成员可能引入的全局状态,这可能会影响程序的可测试性和线程安全性。

Z1tai的博客 1911

Cpp关键字破解(二)【static】篇

关键字总结-static 文章目录关键字总结-static概念static使用场景静态成员的使用类外初始化静态成员 概念 在一个类中,有时候并不希望所有的成员都能与类的对象相关联,而只希望有些成员能够被类的所有对象共享,此时就需要用到static关键字。静态成员可以是public也可以是private,静态成员包括:静态数据成员、静态成员函数。 定义一个类表示银行账户,其中每个类对象都拥有相同的静态成员:利率。一旦更新静态成员后,该类的所有对象都会使用新的静态成员,这是因为静态成员与类直接绑定。 class

日月既往,不可复追 465

【C++八股】static关键字

用于修改变量、函数、类成员的存储方式和作用域。面试中常考 的作用、使用场景、与普通变量的区别。作用:局部变量的生命周期变为整个程序运行期间,但作用域仍然在当前函数内。 ✅ 特点:✅ 应用场景:计数器、状态保持等。✅ 作用:限制全局变量的作用域,使其只能在当前文件内访问。1)普通全局变量(作用域跨文件) (2) 修饰全局变量(作用域仅限当前文件) ✅ 总结:✅ 应用场景:防止变量污染,避免多个文件中的变量重名。(1)普通函数(可跨文件调用) (2) 修饰函数(作用域仅限当前文件) ✅ 总

2301_79867980的博客 795

C++中的static关键字

(5)在C++中,static关键字可以用于定义类中的静态成员函数:与静态成员变量类似,类里面同样可以定义静态成员函数。1、修饰静态局部变量,会改变局部变量的存储位置,从而使得局部变量的生命周期变长,延长至程序结束才销毁,普通的局部变量创建后是放在栈区,这种局部变量进入作用域时创建,出了作用域就销毁。在C语言中static用来修饰局部静态变量和外部静态变量和函数,而C++语言还可以用来定义类的成员变量和函数,即静态成员和静态成员函数,C++的静态成员可以在多个对象实例之间进行通信,传递信息。

weixin_65589140的博客 476

C++ static 关键字面试深度解析

摘要:C++ static 关键字面试深度解析 static 关键字在 C++ 中控制变量/函数的生命周期和可见性,有三大应用场景: 函数内静态局部变量:延长生命周期至程序结束,用于计数器或单例模式 全局静态变量/函数:限制为内部链接,仅在当前文件可见(现代C++建议用匿名命名空间替代) 类静态成员:属于类而非对象,所有实例共享。静态函数无this指针,不能访问非静态成员 关键区别:普通全局变量具有外部链接,而静态全局变量只有内部链接。匿名命名空间比static更优,因其能封装类型(class/struct

jokr_的博客 842

C++ 中 Static 关键字的作用

C++ 中 Static 关键字的作用Static 用在类或者结构体的外部Static 用在类或者结构体的内部Static 作用于局部(Local) Static 能够被用在一个类或者结构体的内部或者外部。 如果用在外部的话,意味着被你声明成 static 的变量只能作用于该定义的 Translation Unit. 如果用在内部的话,则意味着该 static 变量将会共享该类所有实例的内存空间。...

weixin_44387066的博客 772

C++学习——static关键字

本文总结C++语言中重要的关键字static,涉及部分面试题

mingyuexin235的博客 1209

C++ static关键字详解

本文内容会结合三个部分,分别通过代码说明static的特点,以及它们的使用场景,最后拿出几个问题进行讨论。

qq_43262059的博客 1842

[C++——lesson11.static关键字]

本文系统介绍了C/C++中static关键字的多种用法。在C语言中,static可修饰局部变量(改变存储位置和生命周期)、全局变量(限制作用域)和函数(隐藏实现)。C++中static还可修饰类成员,包括静态成员变量(类共享)和静态成员函数(无this指针)。文章通过代码示例详细解析了static的特性,如初始化规则、访问方式等,并提供了面试题案例展示实际应用。最后总结了static在不同场景下的核心作用:控制存储周期和作用域,强调合理使用可提升代码封装性和安全性。全文从基础概念到高级用法循序渐进,帮助读者

2401_83386596的博客 997
上一篇: C++ static、const对象声明与定义 问题 最终解决了
下一篇: c程序内存分布
Qicz
博客等级 码龄16年 56粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值