iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++中的static关键字详解
  • 638
分享到

C/C++中的static关键字详解

2024-04-02 19:04:59 638人浏览 八月长安
摘要

目录C/C++ 中的 static1. 静态局部变量2. 静态全局变量3. static 修饰函数c++的 static 成员静态成员变量 静态成员函数总结:static是

static是 C/C++中的关键字之一,是常见的函数与变量(C++中还包括类)的修饰符,它常被用来控制变量的存储方式和作用范围。 在众多高级语言中都有其作为关键字或函数出现,所以这也是应当被程序员熟知其各种含义的一个单词

在这里插入图片描述

我们知道在函数内部定义的变量,当程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义为全局的变量,但定义一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅只受此函数控制)。static 关键字则可以很好的解决这个问题。

另外,在 C++ 中,需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见时,可将其定义为静态数据。

在这里插入图片描述

C/C++ 中的 static

这里 static 作用主要影响着变量或函数的生命周期作用域,以及存储位置

1. 静态局部变量

定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的

当 static 修饰局部变量时:

  • 变量的存储区域由变为静态常量区
  • 变量的生命周期由局部变为全局
  • 变量的作用域不变。

函数调用开辟栈帧,函数中的局部变量在栈上分配存储空间,当函数执行完毕,函数栈帧销毁,栈空间由系统回收

而在static修饰函数局部变量的时,其修饰的静态局部变量只执行初始化一次,延长了局部变量的生命周期,直到程序运行结束以后才释放,但不改变作用域。

下面用代码进行验证:

#include <stdio.h>
 void fun()
{
	static int val = 0;   //static 修饰局部变量
	val++;
	printf("%d\n", val);
}
int main()
{
	for (int i = 0; i < 7; i++){
		fun();
	}
	return 0;
}

没有 static 时, 函数每调用一次, 变量就会进行一次初始化值为 0,

当由 static修饰时, 初始化语句只会被执行一次所以值会一直累加。

在这里插入图片描述

2. 静态全局变量

在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。

当 static 修饰全局变量时:

  • 变量的存储区域在全局数据区的静态常量区
  • 变量的作用域由整个程序变为当前文件。(extern声明也不行)
  • 变量的生命周期不变。

一个全局变量被 static 修饰,使全局变量只能在定义变量的当前文件使用,不能在其余文件使用,即使 extern外部声明也不行。

原因: 属于文件作用域的声明在缺省的情况下为 external 链接属性, 如定义个全局变量int g_a = 1;a的链接属性为external,而加上 static会修改变量的缺省链接属性,改为internal

声明了全局变量 g_a 和 g_b (具有 external 链接属性 )的其他源文件在使用这两个变量时实际访问的是生命与此处的这两个变量;但是 g_c 只能由这个源文件访问,因为链接属性**为internal

int g_a = 1;
extern int g_b;
static int g_c;

代码验证:

// add.c
static int global_val = 27;   //static 修饰全局变量
 //staticdemo1.c
extern global_val;
 int main()
{
	printf("%d", global_val);
	return 0;
}

不用 static 修饰 global_val 时的结果

在这里插入图片描述

而使用 static 修饰时,链接时就会出现链接错误无法执行。

在这里插入图片描述

全局变量 与 extren

具有 extrenal 链接属性的实体在其他语言术语中称作全局实体(global entity ),所有源文件中的函数均可以访问它。只要变量并非声明与代码块或者函数定义内部,它在缺省的情况下链接属性即为 extrenal。如果一个变量声明与代码块内部,在它面前添加 extren 关键字将使它使它所引用的是全局变量而非局部变量。

具有链接属性为 extrenal 的实体总是具有静态存储类型。 全局变量在程序开始执行前创建,并在整个执行过程中始终存在。从属于函数的局部变量在函数在函数开始执行时进行创建,在函数执行完毕后销毁,但用于执行函数的机器指令在程序生命周期内一直存在。

使用 extren 进行声明提高代码的可读性是良好的编程习惯。

3. static 修饰函数

函数的作用域与全局变量一样都是整个程序。

当 static 修饰函数时:

函数的作用域由整个程序变为当前文件。(extern声明也不行)

一个函数被 static 修饰,使函数只能在定义的源文件使用,不能在其余文件使用,即使 extern外部声明也不行。(同static 修饰全局变量)

如果我们将函数声明为 static,就会把它的链接属性从external,改为internal,这样将使得其他源文件不能访问这个函数;对于函数而言,存储类型不是问题,因为代码总是存储在只读的代码区中。

// add.c
static int add(int a, int b)
{
	return a + b;
}
 //staticdemo1.c
extern add(int a, int b);
 int main()
{
	printf("%d", add(10, 20));
	return 0;
}

这里直接看结果:

没有 static 修饰:

在这里插入图片描述

被 static 修饰:报了与修饰全局变量时同样的链接错误。

在这里插入图片描述

C++的 static 成员

声明为static类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的 成员函数,称之为静态成员函数

注:静态的成员变量一定要在类外进行初始化

class A
{
public :
	A(){   //构造函数
		_count++;
	}
	A(const A& y){
		_count++;
	}
	static int GetCount(){    //静态成员函数
		return _count;
	}
public:      
	int a;
	//静态成员变量--》在类中的是声明要在类外进行定义
	static int _count;  
};
};
 int A::_count = 0;   //静态变量 _count 定义
 void TestA() {
	cout << A::GetCount() << endl;  // 类静态成员通过 类名::静态成员 来访问
	A a1, a2; 
	A a3(a1);
	cout << A::GetCount() << endl;
}

静态成员变量 

1.静态成员变量必须在类外进行定义定义时不用加 static ,类中只是声明

在这里插入图片描述

2.静态成员变量为所有类对象所共享,并没有包含在具体的对象中。

所以并不影响 sizeof() 大小

3.静态成员变量的访问: 

  • 类名::静态成员变量名 
  • 对象.静态成员变量名。
cout << A::_count << endl;
cout << a1._count << endl;

在这里插入图片描述

类的对象可以使用静态成员函数和非静态成员函数。

注:静态成员变量也受访问限定符(public、protected、private)的限制。 所以私有的仍要通过类成员函数接口来进行访问,可以在通过类中公有的成员函数进行访问,

cout << A::GetCount() << endl;

但这种方式调用获取静态成员变量必须由静态成员函数访问,不能通过类名来调用类的非静态成员函数,否则就会出错

在这里插入图片描述

静态成员函数

1.静态成员函数没有隐藏的 this 指针,不能访问非静态成员(变量、 函数)!

在这里插入图片描述

因为静态成员函数没有隐藏的 this 指针所以也不能定义成const成员函数(const 本质就是修饰隐藏参数this )

在这里插入图片描述

2.静态成员函数不能调用非静态成员函数。

在这里插入图片描述

3.非静态成员函数可以调用静态成员函数。

static void fun(){
		_count = 0;
	}
	int GetCount(){
		//cout << this << endl;    
		fun();
		return _count;
	}

总结:

(1) 静态成员变量使用前必须先初始化(在类外定义),如:int A::_count = 0;

(2) 静态成员变量为所有类对象所共享,也受访问限定符(public、protected、private)的限制

(3) 静态成员函不能调用非静态成员函数,非静态成员函数可以调用静态成员函数

(4) 静态成员函数没有隐藏的 this 指针

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: C/C++中的static关键字详解

本文链接: https://www.lsjlt.com/news/143422.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C/C++中的static关键字详解
    目录C/C++ 中的 static1. 静态局部变量2. 静态全局变量3. static 修饰函数C++的 static 成员静态成员变量 静态成员函数总结:static是...
    99+
    2024-04-02
  • 详解C语言中的Static关键字
    一、static关键字的基本含义 首先,static关键字的意思是静态的,用于修饰局部变量,全局变量和函数,修改其数据储存类型 1.局部变量:在任意一个函数内部定义的变量(不加sta...
    99+
    2024-04-02
  • c语言static关键字用法详解
    目录1.static修饰全局变量2.static修饰函数3.static修饰局部变量总结:1.static修饰全局变量 我们创建两个源文件,一个test.c,一个main.c 现在...
    99+
    2024-04-02
  • c++中static关键字的作用
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • C/C++的关键字之static你了解吗
    目录C语言隐藏场景演示解决方法保持变量内容的持久默认初始化为0Cppstatic类成员变量static类成员方法单例模式总结C语言 隐藏 场景演示 当我们同时编译多个文件时,所有未加...
    99+
    2024-04-02
  • C语言Static 关键字解析
    目录01简述02static关键字作用01简述 static关键字在嵌入式C语言当中很简单,它有三个作用: 作用一:在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变...
    99+
    2024-04-02
  • C语言入门篇--关键字static详解
    目录1.修饰局部变量1.1作用1.2举例(1)不加static(2)加static(3)静态局部变量的初始化只会进行一次2.修饰全局变量2.1作用2.2举例(1)不加static(2...
    99+
    2024-04-02
  • 关于C++中的static关键字的总结
    1.面向过程设计中的static1.1静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: 复制代码 代码如下...
    99+
    2022-11-15
    c语言 static
  • C/C++中static,const,inline三种关键字详细总结
    一、关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实...
    99+
    2022-11-15
    static inline const
  • C/C++的关键字static怎么使用
    这篇文章主要介绍“C/C++的关键字static怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C/C++的关键字static怎么使用”文章能帮助大家解决问题。C语言隐藏场景演示当我们同时编译...
    99+
    2023-06-29
  • 深度理解C语言中的关键字static
    目录一、函数和变量的多文件问题1.1.为什么全局变量和函数需要跨文件访问二、static修饰变量和函数2.1.static修饰全局变量2.2.static修饰局部变量2.3.为什么局...
    99+
    2024-04-02
  • 详解Java的static关键字
    文章目录 🎄静态方法🌺静态方法和非静态方法对比🛸静态方法实例🛸非静态方法实例 🌹static关键字⭐static变量⭐static代码块 ...
    99+
    2023-12-22
    java 开发语言 static 静态方法
  • C++ 中如何使用static关键字
    C++ 中如何使用static关键字,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、静态全局变量在全局变量前,加上C++ static关键字,该变量就被定义成...
    99+
    2023-06-17
  • C++中的explicit关键字详解
    目录前言1. 抑制构造函数定义的隐式转换2. 为转换显式地使用构造函数3. 类型转换运算符可能产生意外结果4. 显示的类型转换运算符5. explicit练习5.1 当不使用expl...
    99+
    2024-04-02
  • C#中的yield关键字详解
    在"C#中,什么时候用yield return"中,我们了解到:使用yield return返回集合,不是一次性加载到内存中,而是客户端每调用一次就返回一个集合元...
    99+
    2024-04-02
  • C# 中的partial 关键字详解
    目录引言分部类partial 分部限制分部接口和结构分部方法this 和 partial 的区别引言 partial 关键字用于拆分一个类、一个结构、一个接口或一个方法的定义到两个或...
    99+
    2024-04-02
  • C语言中的Static关键字怎么用
    这篇文章主要介绍C语言中的Static关键字怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、static关键字的基本含义首先,static关键字的意思是静态的,用于修饰局部变量,全局变量和函数,修改其数据储存...
    99+
    2023-06-26
  • 全面了解C语言 static 关键字
    目录一,前言二、认识多文件1、多文件的创建2、为什么要有多文件3、为什么要有头文件4、多文件在代码中的具体体现三、最名不符实的关键字 - static1、static 修饰局部变量2...
    99+
    2024-04-02
  • c语言中关键字Static怎么用
    这篇文章将为大家详细讲解有关c语言中关键字Static怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、可执行程序内存分配1. 可执行程序程序分段一个程序的3个基本...
    99+
    2024-04-02
  • C语言关键字auto与register及static专项详解
    目录1.auto2.register3.static1.auto 在解释 auto 之前,先来了解一下什么是局部变量。 在很多印象中,对局部变量的描述是:函数内定义的变量称为局部变量...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作