【C/C++】复习关键字static

【C语言】静态关键字static的用法(详解) 【C语言】静态关键字static的用法(详解 阅读详情

目录

1.C语言中的static

1.1 C语言中的静态局部变量

1.2 C语言中的中的静态全局变量

1.2.1 特点

1.2.2 示例

1.3 C语言中的静态函数

2.C++中的static 

2.1 修饰成员变量

2.1.1 特点

2.1.2 示例

 2.2 修饰成员函数


1.C语言中的static

1.1 C语言中的静态局部变量

静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量 在函数内定义它的生存期为 整个程序生命周期,但是其作用域仍与自动变量相同 ,只能在定
义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。
(2)对基本类型的静态局部变量若在声明时未赋以初值,则系统自动赋予0值 。而对自动变量不赋初值,则其值
是不定的。

   根据静态局部变量的特点,可以看出它是一种生存期为整个程序生命周期.虽然离开定义它的函数后不
能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调
用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述
目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

关键字: 在特定范围内继续使用被调用后留下的值

1.2 C语言中的中的静态全局变量

1.2.1 特点

全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量.全局变量本身就是静态存储方式,
静态全局变量当然也是静态存储方式,这两者在存储方式上并无不同.

这两者的区别在于:
(1)非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个
源文件中都是有效的。
(2)静态全局变量 则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中
不能使用它.由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免
在其它源文件中引起错误。

从以上分析可以看出,把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围.

关键字: 限制使用范围

1.2.2 示例

1.3 C语言中的静态函数

   如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,
这种函数称为static函数与称为静态函数.定义一个static函数,只需在函数类型前再加一个“static”关键字
即可,如下所示:
static 函数类型 函数名(函数参数表) {……}

关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数.但此处“static”的含义不是指存储方
式,而是指对函数的作用域仅局限于本文件.

使用内部函数的好处是:
不同的人编写不同的函数时,不用担心自己定义的函数是否会与其它文件中的函数同名,因为同名也没有关系.

2.C++中的static 

2.1 修饰成员变量

在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员.

2.1.1 特点

类的静态成员有以下特点:

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

2.1.2 示例

#include <iostream>
using namespace std;
class Test
{
        public:
                Test() {}
                ~Test() {}

                Test(const Test& t)
                {
                        if(this != &t)
                        {
                                this->m_nTest1 = t.m_nTest1;
                                this->m_nTest2 = t.m_nTest2;
                                this->m_nTest3 = t.m_nTest3;
                        }
                }

                Test& operator=(const Test& t)
                {
                        if(this != &t)
                        {
                                this->m_nTest1 = t.m_nTest1;
                                this->m_nTest2 = t.m_nTest2;
                                this->m_nTest3 = t.m_nTest3;
                        }
                        return *this;
                }
                void PrintOut()
                {
                        //cout << "m_nSTest1 is " << m_nSTest1 << ", m_nSTest2 is " << m_nSTest2 << ", m_nSTest3 is  " << m_nSTest3 << endl;
                        cout << "m_nTest1 is " << m_nTest1 << ", m_nTest2 is " << m_nTest2 << ", m_nTest3 is  " << m_nTest3 << endl;
                }

                static void PrintStatic()
                {
                        //cout << "m_nTest1 is " << m_nTest1 << ", m_nTest2 is " << m_nTest2 << ", m_nTest3 is  " << m_nTest3 << endl;// wrong
                        cout << "m_nSTest1 is " << m_nSTest1 << ", m_nSTest2 is " << m_nSTest2 << ", m_nSTest3 is  " << m_nSTest3 << endl;
                }
        public:
                int m_nTest1;
                static int m_nSTest1;
        protected:
                int m_nTest2;
                static int m_nSTest2;
        private:
                int m_nTest3;
                static int m_nSTest3;
};
int Test::m_nSTest1 = 10;
int Test::m_nSTest2 = 20;
int Test::m_nSTest3 = 30;
//int Test::m_nSTest1 = 10;// wrong ,不能重新定义
int main()
{
        Test t;
        t.PrintOut();
        //t.PrintStatic();//错误
        Test::PrintStatic();
        return 0;
}

 2.2 修饰成员函数

static 成员函数,它为类的全部服务而不是为某一个类的具体对象服务。普通的成员函数一般都隐含了一个
this指针,因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。如函数fn()
实际上是this->fn()。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this
指针.从这个意义上讲,它无法访问属于类对象的no-static数据成员,也无法访问no-static成员函数,它只
能调用其余的静态成员函数.

关于静态成员函数,可以总结为以下几点:
(1)出现在类体外的函数定义不能指定关键字static ;
(2)static成员之间可以相互访问 ,包括static成员函数访问static数据成员和访问static成员函数;
(3)非静态成员函数可以任意地访问静态成员函数和静态数据成员;
(4)静态成员函数不能访问非静态成员函数和非静态数据成员,只能访问静态的;
(5)由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
(6)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函
数,也可以直接使用如下格式:<类名>::<静态成员函数名>(<参数表>),如:Test::PrintStatic(),调
用类的静态成员函数。
但是,一样要遵从public,protected,private访问规则.

3.用法

多重定义报错是加上static.链接

【C/C++】笔试面试题及答案汇总 第一部分:基本概念及其它问答题1、关键字 static 的作用是什么?2、“引用”与指针的区别是什么?3、.h 头文件中的 ifndef/define/endif 的作用?4、#include 与 #include “file.h”的区别? 5、描述实时系统的基本特性6、全局变量和局部变量在内存中是否有区别?如果有,是什么区别?41、一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指 向的节点?39、写一个“标准”宏36、动态内存分配(Dynamic memory al 阅读详情

相关推荐

C和C++的区别和联系(扩展知识)

2017/3/17 复习整理:C/C++区别与联系; 关于C和C++的区别是面试中经常会被问到的问题,本着即将面试的心态,进行知识整理,并对小知识点进行扩展; C/C++的联系: C++是C的超集,兼容大部分C的语法的结构; 联系嘛我只能想到这个,毕竟cplusplus嘛! C/C++区别: 第一点就应该想到C是面向过程的语言,而C++是面向对象的语言,一般简历上第一条都

John的博客 4万+

C语言-static的用法

C语言-static的用法

hmh520i的博客 9754

雷达杂波的基础知识

例如工作在海上的机载雷达,航行在海上的船用雷达,它们都不想要海杂波,会影响它们对小目标的检测,从而以为“漏掉”海面飞行的巡航导弹而被击毁。海杂波的反射系数是非常复杂的,影响的因素很多,除了和雷达参数有关,显然还和海况息息相关,经验模型经常将反射系数表示成海况的函数,在不同条件和不同模型的情况下,反射系数的值不同。说到“杂波”,你可能想到的就是如何去抑制它,去减少它在雷达回波中的分量,在很多情况是这样的。云雨的反射对飞机雷达来说是不希望的,但确是气象雷达所利用的,可以用来测量降雨率,提升天气预报的准确性。

qq_43416206的博客 2133

static关键字在C语言中的3种用法

static关键字在C语言中的3中用法

川子767的博客 2709

zabbix5+dify+ollama+deepseek+企业微信 本地部署实现故障智能分析

zabbix5告警信息deepseek自动分析

slc14211421的专栏 3073

写给音响工程师的科普文章(二)——从模电角度去了解调音台话放

    上一篇讲到调音台第一级放大电路为差分放大器,关于差分放大器的基础知识可以参考以下资料:https://wenku.baidu.com/view/e6a46aaa2af90242a995e537 在教材中的差分放大器基本形式是这样子的,在实际电路中把RE电阻换成两个2倍RE,于是变成这样 然后我们现在来对比调音台中的差分放大器和教材中的有什么区别,我就拿yamaha 01V 96来说...

huanghaoAudio的博客 7704

【C语言】 Static关键字的用法和详解(太细了!!!)

static在不同的语言中又有不同的使用方法,本文介绍的是static在C语言当中的用法。从本质剖析却又通俗易懂,内容简单理解却十分重要。

weixin_60804760的博客 6万+

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

距离场在运动规划中则常用于地图建模和轨迹梯度优化。本文图解欧氏距离场EDT的算法原理,并基于双线性插值给出欧氏梯度场的公式推导,并给出ROS C++和Python的算法实现加深理解

FRIGIDWINTER的博客 4648

C语言中static的用法(修饰局部变量,修饰全局变量,修饰函数)

static 关键字有三种用法 static 修饰局部变量 - 静态局部变量 static 修饰全局变量 - 静态全局变量 static 修饰函数 - 静态函数 static 关键字的三种用法1. static 修饰局部变量 - 静态局部变量2. static 修饰全局变量 - 静态全局变量3. static 修饰函数 - 静态函数 1. static 修饰局部变量 - 静态局部变量 static可使得局部变量出了自己的范围也不会销毁,本质上是改变了局部变量的生命周期,但其作用域还是局部的。 详细点说,

m0_53558236的博客 1万+

LSTM+Transformer混合模型时间序列预测实战教学

LSTM+Transformer混合模型时间序列预测实战教学 毕业设计

8219

SAP ABAP Append structure 介绍

所有在 append structure 上增强的字段都是 append structure 的一部分,这意味着对这些增强所做的任何更改仅仅施加在 append structure 上,而不会影响被增强的 ABAP DDIC 结构。这同样适用于 transport. 激活数据库表或结构时,会找到所有关联的 append structure,并将它们的组件附加到数据库表或结构。Append structure(附加结构)是 ABAP 字典中附加到另一个结构或数据库表并将其组件附加到它们的结构。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1165

面试复习(一)——C/C++关键字:static(静态)变量有什么作用

数据成员可以分为静态变量、非静态变量两种。 静态成员:静态类中的成员加入static修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态成员,因为静态成员存在于内存,所以非静态成员可以直接访问类中的静态成员。 非静态成员:所以没有加static的成员都是非静态成员,当类被实例化后,可以通过实例化的类名...

qq_37764129的博客 1894

基于Python的军事装备数据爬取与分析:从网页抓取到数据可视化实战

本文将详细介绍如何使用Python最新技术栈构建一个完整的军事装备数据爬虫系统。我们将从爬虫基础讲起,逐步深入到异步爬取、反反爬策略、数据存储与分析等高级主题,最终实现一个能够自动抓取、清洗、存储和分析军事装备数据的完整解决方案。文章包含大量实战代码示例,涉及requests-html、aiohttp、Playwright等现代爬虫库,以及MongoDB存储、Pandas分析和Pyecharts可视化等技术。关键词:Python爬虫、军事数据、异步爬取、反反爬、数据可视化。

2201_76125261的博客 1189

C++复习

reserve和resize通过reserse函数改变容器的最大容量,resize函数改变容器中的有效元素个数。1、当所给值大于容器当前的capacity时,将capacity扩大到该值。2、当所给值小于容器当前的capacity时,什么也不做。1、当所给值大于容器当前的size时,将size扩大到该值,扩大的元素为第二个所给值,若未给出,则默认为0。2、当所给值小于容器当前的size时,将size缩小到该值。

xwy13886467077的博客 1078

推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术

在 pooling 方法上,我们也尝试过不同层 pooling,或者在多层上增加 attention 聚合 BERT 多层结果,效果和最后一层所有 token 做 average pooling 相当。损失函数方面,在排序阶段使用pairwise比 pointwise 损失函数的效果会更好。

丨汀、的博客 1109

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

一文搞定C/C++ 技术面试基础知识总结

宏定义 #defineconst 常量宏定义,相当于字符替换常量声明预处理器处理编译器处理无类型安全检查有类型安全检查不分配内存要分配内存存储在代码段存储在数据段可通过#undef取消不可取消如何定义一个只能在堆上(栈上)生成对象的类?

qq_44815135的博客 2358

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C/C++常见八股文面试题

深拷贝;附strcpy和memcpy区别_strcpy是深克隆-优快云博客大端:高位地址存入低位字节,地位地址存入高位字节小端:低位地址存低位字节,高位地址存高位字节一图看懂大端与小端的区别 - 知乎。

qq_46800111的博客 1106

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

嵌入式软件(C/C++/RTOS/Linux)基础面试题

摘要:本文总结了嵌入式开发中的核心知识点,分为三部分:1) C/C++编程要点,包括static/volatile关键字、虚函数、RAII、指针与数组区别等;2) MCU/RTOS相关技术,涵盖任务调度、DMA应用、中断处理、通信协议等;3) Linux系统编程,涉及内核态通信、驱动开发、进程线程区别、IPC机制等。最后提供了面试反问建议和疑难问题解决思路。内容涵盖从底层硬件到操作系统层面的嵌入式开发核心技术,适合开发者复习和面试准备。

Leo_Mine的博客 1106

C/C++求职宝典21个重点笔记(常考笔试面试点)

转载自C/C++求职宝典21个重点笔记(常考笔试面试点)。 1. char c = '\72'; 中的\72代表一个字符,72是八进制数,代表ASCII码字符“:”。 2. 10*a++ 中a先进行乘法运算再自增(笔试中经常喜欢出这类运算符优先级容易混淆的输出问题)。 3. const和static的作用     太常见的问题了,下面给出一个较详细的参考答案:  

竭尽全力的专栏 1025

一、基础语法、数据类型与函数

本文系统梳理了C/C++核心知识点,划分为7大模块:1.语言概览与程序基础(程序执行机制、语言范式对比);2.基础语法与变量语义(声明定义、初始化、左值右值);3.数据类型与底层存储(浮点表示、指针引用差异);4.函数机制(调用流程、内联函数、重载);5.关键字与存储管理(const/static体系);6.C++类型转换(4种转型操作符);7.面向对象基础(构造/析构函数)。重点解析了指针与引用的本质区别、const的多场景应用、函数参数传递方式、static的三重含义等核心概念,并揭示了33个考点间的内

Question_123456的博客 335

嵌入式知识点总结 C/C++ 专题提升(一)-关键字

嵌入式知识点总结C/C++专题提升(一)-关键字

你要拥有一个你喜欢并且热爱的人生 1万+

c++ static关键字

c++ static关键字c中的static1.函数内部变量定义2.全局变量定义3. 使用static对函数定义c++中的static1. 在类中定义static变量2. 在类中定义static函数 最近在看一个项目时,发现他源文件中有一些生涩的static用法,便去复习了一下关于static的用法,在这里总结一下。错漏之处,请不吝指正。 c中的static 1.函数内部变量定义 int fun() { static int n = 10; return n--; } 使用这种方式定义的变量,会存储在

qq_59582611的博客 340

C/C++static的巧妙用法

C/C++static的巧妙用法 学过C或者C++的想必都知道static定义静态变量。但是通过书中的例题实在是想不明白它到底有什么用途,本编文章将通过一个例子来介绍static的巧妙用法,让你对static定义的静态变量用更深层的认识。 首先先来复习一下什么是静态变量(会的可以直接略过) 静态变量的类型说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是...

weixin_43476040的博客 421

static详解

时,它的核心作用是。

weixin_71964451的博客 2136

C语言复习—static/const/volatile关键字

static/const/volatile关键字 static 先从C语言开始 1- static修饰代码块内部的变量(局部变量),改变了变量的存储类型,变量将从栈区转到静态区,不改变变量的属性和作用域。 2- static修饰局部变量,具有 “记忆性” 的特点,还可以延长它的生命周期。 3- 普通的局部变量是在栈上分配空间,因此每次调用函数时,分配的空间可能都不...

Demons的博客 476
上一篇: 【Linux服务器开发】1.5 单例模式
下一篇: 【Linux服务器开发】1.4 布隆过滤器-判断海量数据中某条数据是否存在
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值