C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题) 您所在的位置:网站首页 rgcbv什么意思 C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题)

C/C++ static关键字详解(最全解析,static是什么,static如何使用,static的常考面试题)

2024-01-30 05:52| 来源: 网络整理| 查看: 265

目录

一、前言

 二、static关键字是什么?

三、static关键字修饰的对象是什么? 

 四、C 语言中的 static

 🍎static的C用法

 🍉static的重点概念

 🍐static修饰局部变量

 💦static在修饰局部变量和函数的作用

 🍓static修饰全局变量和函数

💦static在修饰全局变量和函数的作用

 五、C++中的 static

 🍌static的C++用法

🍊static在C++中的重点概念

 💦静态成员为所有类对象所共享,不属于某个具体的实例

 💦静态成员变量必须在类外定义,定义时不添加static关键字

 💦静态成员函数没有隐藏的this指针,不能访问任何非静态成员

 💦访问静态成员变量的特殊方式

 💦静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

六、static面试题

七、static OJ面试题

八、共勉

一、前言

        static,中文意思是静态的,作为C/C++中常用关键字中的一个很重要的关键字,其中用法多样且复杂难以理解,用起来总是丈二和尚摸不着头脑,把我折磨的一头雾水(主要是博主很菜😂)。

        也许大家对于这些知识都是一知半解(除过一些大佬),没有真正的搞透澈,一问我都会(这就是我),但是真正引用的时候,就会出现很多问题,而且百度的时候,大部分都讲得不是很清楚,所以为了帮助大家解决这个问题(实际上是自己不会),在这里进行一个全面的static介绍和总结。

        本文将会循序渐进,先从C语言的static讲起,慢慢延申到C++,从易到难,每一步都会举一些通俗易懂的例子帮助大家理解(帮助自己理解,怕忘记😂),好了开始整活!

 二、static关键字是什么?

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

三、static关键字修饰的对象是什么? 

1.局部变量

2.全局变量

3.函数

 四、C 语言中的 static  🍎static的C用法

    1️⃣: 修饰局部变量(称为静态局部变量)

    2️⃣: 修饰全局变量(称为静态全局变量)

    3️⃣: 修饰函数(称为静态函数)

 🍉static的重点概念

1️⃣:在函数中声明变量时, static 关键字指定变量只初始化一次,并在之后调用该函数时保留其状态。 2️⃣:在声明变量时,变量具有静态持续时间,并且除非您指定另一个值。 3️⃣ :在全局和/或命名空间范围 (在单个文件范围内声明变量或函数时) static 关键字指定变量或函数为内部链接,即外部文件无法引用该变量或函数。 4️⃣:static 关键字 没有赋值时,默认赋值为 0 

5️⃣:static修饰局部变量时,会改变局部变量的存储位置,从而使得局部变量的生命周期变长。⭐:接下来,将重点讲解上面三个作用个五点概念的理解,和应用

 🍐static修饰局部变量

1️⃣:在函数中声明变量时, static 关键字指定变量只初始化一次,并在之后调用该函数时保留其状态。 5️⃣:static修饰局部变量时,会改变局部变量的存储位置,从而使得局部变量的生命周期变长。

接下来用们用一段代码来进行解析:

#include #include void test() { int x = 0; x++; printf("%d ", x); } int main() { int i = 0; printf("%d\n", i); while (i < 10) { test(); i++; } return 0; }

        这段代码中每次调用test()函数时创建局部变量x赋值为 0,每次局部变量x出了test()函数后都会自行销毁。         所以可以很容易得到输出结果为:1 1 1 1 1 1 1 1 1 1

        接着我们用上static关键字来修饰  test()函数中的局部变量 x:

#include #include void test() { static int x = 0; x++; printf("%d ", x); } int main() { int i = 0; while (i < 10) { test(); i++; } return 0; }

        输出结果变成了:1 2 3 4 5 6 7 8 9 10         原因是static修饰了局部变量x,令局部变量x变成静态的,且只能初始化一次,使得每次test()函数结束时局部变量x都不销毁,再次进入test()函数时则保留原有数值运行,因此x++数值越来越大。

⭐总结:

(1)static关键字修饰局部变量不改变作用域,但是生命周期变长。

(2)本质上,static关键字修饰局部变量,改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样。普通的局部变量放在栈区,这种局部变量进入作用域创建,出作用域释放。局部变量被static修饰后成为静态局部变量,这种变量放在静态区,创建好后,直到程序结束后才释放。  

4️⃣:static 关键字 没有赋值时,默认赋值为 0 

接下来用们用一段代码来进行解析:

int a; int main() { char str[10]; printf("integer: %d; string: (begin)%s(end)\n", a, str); return 0; }

        在这段代码中,我们并没有对全局变量 a 和字符串数组 str 进行赋值,所以在输出时会出现随机值的现象。所以很容易得到如下的结果:

输出:

integer: 0; string: (begin)烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫攼l(end)

⚠ 注意:a 输出为 0 是因为 此时 a 是全局变量,也存放在静态区,所以可以默认值为 0 .

        接着我们用上 static关键字 来修饰 全局变量 a 和字符串数组 str 

static int a; int main() { static char str[10]; printf("integer: %d; string: (begin)%s(end)\n", a, str); return 0; }

  输出:

integer: 0; string: (begin)(end)

       ⭐总结:

         static的另一个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加‘\0’;太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是 ‘\0’。  

 💦static在修饰局部变量和函数的作用

 ⭐作用:

        保持变量内容的持久

static的第一个作用是保持变量内容的持久,即static变量中的记忆功能和全局生存期。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。之后再次运行到含有 static 关键字的初始化语句时不会再执行该语句。共有两种变量存储在静态存储区:全局变量和 static 变量,只不过和全局变量比起来,static 可以控制变量的可见范围。  🍓static修饰全局变量和函数

3️⃣ :在全局和/或命名空间范围 (在单个文件范围内声明变量或函数时) static 关键字指定变量或函数为内部链接,即外部文件无法引用该变量或函数。         针对上面这个概念的理解我们一次来解析以下: 1. 首先说一下全局变量,全局变量的作用域十分的广,只要在一个源文件中定义后,这个程序中的所有源文件、对象以及函数都可以调用,生命周期更是贯穿整个程序。文件中的全局变量想要被另一个文件使用时就需要进行外部声明(以下用extern关键字进行声明)。-----也即是说全局变量既可以在源文件中使用,也可以在其他文件中使用(只需要使用extern外部链接以下即可)

2. static修饰全局变量和函数时,会改变全局变量和函数的链接属性-------变为只能在内部链接,从而使得全局变量的作用域变小。   接着我们用代码进行解析:

首先,在Hello.c文件中定义一个全局变量 char a 和函数 PrintfHello(),之后在test.c文件中进行extern 进行外部链接,运行代码:

之后我们进入正题 在全局变量和函数之前用 static进行修饰,看看效果:

        会发现生成错误,无法解析外部符号a和PrintfHello()等,全局变量a和PrintfHello()不能被test.c文件调用了。所以我们可以很容易看出static修饰后让全局变量a和PrintfHello()的作用域变小了,令全局变量a和PrintfHello()无法被其他文件调用。

⭐总结:

1. 全局变量和函数本身是具有外部链接属性的,在Hello.c文件中定义的全局变量和函数,在test.c文件中可以通过【链接】来使用;

2. 但如果全局变量被static修饰,那这个外部链接属性就会被修改成内部链接属性,此时这个全局变量就只能在自己的源文件中使用;

💦static在修饰全局变量和函数的作用

⭐作用:         如果加了 static,就会对其它源文件隐藏。例如在 a 和 printHello 的定义前加上 static,main.c 就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static 可以修饰函数和变量,将其对其他源文件隐藏起来,从而避免命名冲突。对于函数来讲,static 的作用仅限于该隐藏功能。

 五、C++中的 static

        本小节主要介绍在 C++中引入了面向对象的特性(类)之后,static关键字的一些用途。当然 C++ 是兼容 C 语言的,所以C语言中的 static 在C++中也是成立的。

 🍌static的C++用法

 声明为static的类成员称为类的静态成员,分为如下两类:

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

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

🍊static在C++中的重点概念

1️⃣:静态成员为所有类对象所共享,不属于某个具体的实例 2️⃣:静态成员变量必须在类外定义,定义时不添加static关键字 3️⃣:静态成员函数没有隐藏的this指针,不能访问任何非静态成员 4️⃣:访问静态成员变量的特殊方式

5️⃣:静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值⭐:接下来,将重点讲解上面三个作用个五点概念的理解,和应用

 💦静态成员为所有类对象所共享,不属于某个具体的实例

请看如下代码:

class A { private: static int _n; int _k; char _a; }; int main() { cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有