【面经】static关键字总结

server/2024/9/20 12:58:12/

1.什么是static关键字

static中文意思是静态的,是C/C++中常见的一个关键字。它一般用于修饰变量(局部变量/全局变量)和函数。

对于变量来说,static关键字用来控制变量的存储方式,作用范围和生命周期。

下面我们分别在C语言和C++中讨论static的用法。

2.static在C语言中的运用

2.1static修饰局部变量

2.1.1static修饰的变量只初始化一次

1.在函数中声明变量时,static修饰的变量只初始化一次。

2.static修饰局部变量时,会改变局部变量的存储位置(静态区),所以该局部变量的生命周期变长(在程序结束时才会销毁)。

原因:static修饰了局部变量x,fun函数每次调用完毕,x不销毁,再次调用fun时,x保持原有数值运行。

总结:static关键字修饰局部变量不改变作用域,但是延长生命周期(存在静态区),进程结束时才会销毁。

2.1.2static修饰局部变量默认初始化为0

和全局变量一样,static修饰局部变量默认初始化为0。

因为static修饰的局部变量存在静态区,全局变量也存在静态区,所以它们有一些相似的特性。

static修饰的局部变量和全局变量的区别:前者只是局部可见,后者全局可见。

2.2static修饰全局变量和函数

1.首先说一下全局变量的作用域非常广泛,只要在一个源文件中定义后,这个程序中的所有源文件、对象以及函数都可以调用,生命周期更是贯穿整个程序。文件中的全局变量想要被另一个文件使用时就需要进行外部声明(以下用extern关键字进行声明)。

2.static修饰全局变量和函数时,会改变全局变量和函数的链接属性-------变为只能在内部链接,从而使得全局变量的作用域变小。

总结:

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

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

3.static在C++中的运用

C++是兼容C的,所以C中的static在C++中依然适用。本小结主要介绍static在类中的用途。

类中被static修饰的成员分为两类:1.静态成员变量。2.静态成员函数。

注意:静态成员函数一定要在类外初始化。

重点概念:

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

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

3.静态成员函数没有隐含的this指针,不能访问任何非静态成员。

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

示例一:

这个例子说明静态成员变量和函数为所有类对象所共享,不属于某个具体的实例。它们不参与类大小的计算。

示例二:

这个例子说明静态成员函数一定要在类外初始化。

示例三:

这个例子说明静态成员函数不可以访问非静态成员变量,因为它没有this指针。

3.1公有静态成员变量的访问方式

1.通过类对象.静态成员来访问。

2.通过类名::静态成员来访问。

3.通过匿名对象突破类域进行访问。

3.2私有静态成员变量的访问方式

1.通过类对象.静态成员函数来访问。

2.通过类名::静态成员函数来访问。

3.通过匿名对象调用静态成员函数来访问。

由此可见静态成员函数也是这三种访问方式,但是非静态成员函数不可以通过类名::静态成员函数来访问。

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

3.3小问题

静态成员函数可以访问非静态成员函数嘛:

答:不可以,因为没有this指针。

非静态成员函数可以调用静态成员函数嘛:

答:可以,静态成员为所有类所共享,不受访问限制。


http://www.ppmy.cn/server/119398.html

相关文章

Paragon NTFS for Mac和Tuxera NTFS for Mac,那么两种工具有什么区别呢?

我们在使用Mac系统读取U盘的过程中往往会遇到一个问题,那就是U盘插进电脑无法显示,或者只能读取不能编辑。出现这种情况的原因就一般是格式错误。 很多小伙伴在解决这种问题的时候会选择使用U盘读写工具,那么哪一种读写工具比较好呢&#xf…

2024java高频面试-数据库相关

前言:趁着年轻,博主准备在拼一把,看能不能挑个可以干到退休的牛马工位!!! 废话不多说,面试真题赶紧一股脑倒进我的脑袋瓜子里吧!!! 事务四大特性&#xff1f…

.Net Gacutil工具(全局程序集缓存工具)使用教程

GAC介绍: GAC(Global Assembly Cache)全局程序集缓存,是用于存放.Net应用程序共享的程序集。 像平常我们在Visual Studio中引用系统程序集时,这些程序集便来自于GAC。 GAC默认位置为:%windir%\Microsoft…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

计算机网路(应用层)

客户/服务方式(C/S)方式和对等方式(P2P方式) 客户/服务器方式(Client/Server,C/S)方式 客户/服务器是指通信中所涉及的两个应用进程。 客户/服务器方式所描述的是进程之间的服务和被服务的关…

ThinkCMF框架任意内容包含漏洞的讲解

本文来自无问社区,更多网安资料可前往查看http://www.wwlib.cn 背景描述 ThinkCMF是一款基于PHPMYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建。 ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可…

[vue2+axios]下载文件+文件下载为乱码

export function downloadKnowledage(parameter) {return axios({url: /knowledage/download,method: GET,params: parameter,responseType: blob}) }添加 responseType: blob’解决以下乱码现象 使用触发a标签下载文件 downloadKnowledage(data).then((res) > {let link …

ubuntu 自带截图快捷键

以 ubuntu 20.04 为例 先找到键盘上的 PrintScreen 其为截屏键。在我的thinkbook14 笔记本上,其缩写为 PrtSc 截图 保存到文件 Print Screen 截取当前整个界面Alt Print Screen 截取选中的窗口Shift Print Screen 自由选取窗口 保存到剪切板 Ctrl Print Sc…