static关键字的作用

article/2025/9/12 15:47:44

目录

C语言中static关键字的作用

1.static关键字修饰局部变量

2.static关键字修饰全局变量

3.static关键字修饰函数

在C++中static关键的作用

1.静态成员变量

2.静态成员函数


C语言中static关键字的作用

1.static关键字修饰局部变量

概念: static修饰局部变量就使之成为静态局部变量。

作用域: 静态局部变量的作用域并未发生变化,在其所在的局部范围,也就是其所定义的代码块内部。

生存期: 静态局部变量实际上是特殊的全局变量,它们位于相同的内存区域,内存分为栈区,堆区,静态存储区。静态局部变量和全局变量都位于静态存储区,因此静态局部变量的生存期与全局变量一样是全局的,随程序启动而生,随程序结束而消亡。

特点: 静态局部变量的初始化只会在第一次进入这个函数时进行初始化,当离开函数的时候,静态局部变量会继续存在并保持其值,以后进入函数时会保持上次离开时的值。

2.static关键字修饰全局变量

因为全局变量具有外部连接属性,外部任意一个源文件想要使用其他源文件中的全局变量,只需要先使用extern关键字进行声明,然后就可以使用,也就是说某个源文件的全局变量可以在整个项目中被任意的一个源文件使用,所以全局变量的作用域是整个工程。当一个全局变量被static所修饰的时候,它就称为了静态全局变量,静态全局变量具有内部连接属性,使得这个静态全局变量只能在自己所在的编译单元中被使用,而不能被其它编译单元所使用,否则会出现链接性错误。

static修饰变量时,如果变量没有被初始化会被自动初始化为0

3.static关键字修饰函数

函数也是具有外部连接属性的,编译器每次编译只处理一个编译单元,当某个编译单元需要使用其他编译单元中的函数,只需要声明该函数(或者包含该函数声明所在的头文件)然后就可以使用,当一个函数被static所修饰的时候,这个函数的外部连接属性就变成了内部连接属性,也就成为了静态函数,使得这个静态函数只能在自己所在的编译单元中被使用,而不能被其它编译单元所使用,否则会出现链接性错误。

通常我们在头文件中声明一个函数,然后在源文件中去定义该函数,在定义某函数时需要将某一段代码封装成为另一个函数以达到复用的目的,这段代码所封装成的函数只是为了定义那个函数所使用,不会在其它源文件中使用,所以将其声明为static。

在C++中static关键字的作用

static关键字修饰类中成员使之成为静态成员,静态成员的特点如下:

  • 静态成员也是类的成员,受public、protected、private 访问限定符的限制。
  • 静态成员为所有类对象所共享,不属于某个具体对象,它是属于类的,只有一份内存,类静态成员可用类名::静态成员或者对象.静态成员来访问。类名访问,肯定是从类外访问,那么类外访问的话,就要求静态成员是公有属性,可以用类名访问这一点也说明:静态成员变量肯定不是属于对象的,如果是属于对象,那么就不能用类名访问了。

静态成员包括静态成员变量和静态成员函数,static关键字修饰成员变量使之成为静态成员变量,static关键字修饰成员函数使之成为静态成员函数。

1.静态成员变量

特性:

  • 在对象的构造函数中不能对静态成员变量进行初始化,因为静态成员变量不属于单个对象,不需要对象去初始化。静态成员变量在类中加static声明,在类外进行初始化定义,初始化定义时不添加static关键字。若未对静态成员变量进行初始化操作,编译器会自动将其初始化为0。
  • 静态成员变量只能初始化,不能赋值
  • 静态成员变量可以实现多个对象之间的数据共享,它是类的所有对象的共享成员,它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。
  • 静态成员变量存储在静态存储区,和静态局部变量和全局变量一样,它的生存期是全局的,是在程序开始运行时被分配空间,到程序结束之后才释放,只要类中指定了静态成员变量,即使不定义对象,也会为静态成员变量分配空间。

如图,如果在类中进行初始化定义,编译器就会报错

改成如下,类中声明,类外定义就没有问题了

如果给静态成员变量赋值,编译器就会报错

2.静态成员函数

定义方式:

  1. 类中声明,类外定义
  2. 类中定义

class ClassName
{
public:static Type fun(){}//在类中定义static Type fun2();//类中声明
};
Type ClassName::fun2(){}//在类外定义

在类外定义的时候不需要再加上static

特性:

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

没有隐藏的this指针是因为可以通过类名直接去访问函数,那么过程中间不存在对象,this指针就没有对象去指向了,为了避免这种情况的发生,索性就静态函数中就不要this指针了,如果通过对象去调用静态成员函数,虽然可以正确调到,但是this指针也没了。

不能访问任何非静态成员。原因之一是因为不存在this指针,因此你无法在静态成员函数中通过.操作符和->操作符来访问属于某个具体对象的非静态成员。静态成员函数只能访问静态成员。普通成员函数可以访问普通成员,也可以访问静态成员。


http://chatgpt.dhexx.cn/article/41oH5qjG.shtml

相关文章

静态关键词:static

static关键字的作用 static是静态的意思,可以修饰成员变量,表示给成员变量只在内存中存储一份,可以被共享访问、修改 成员变量可以分为2类1、静态成员变量(有static修饰,属于类,内存中加载一次&#xff…

C# -- static 关键字

一、static关键字 static 关键字,用于修饰类,字段,属性,方法,构造方法等。被 static 修饰的类称之为“静态类”; 被 static 修饰的成员称之为“静态成员”,被修饰过的成员分别称为:…

static关键字详解

1.概述: static:就是多个对象共享同一份数据 一个类的不同对象有些共享的数据,这样我们就可以使用static来修饰 一旦使用了static关键字,那么这样的内容不再属于对象,而是属于类的,所以凡是本类的对象&…

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

static 关键字详解 C/C 中的 static1. 静态局部变量2. 静态全局变量全局变量 与 extren 3. static 修饰函数 C的 static 成员静态成员变量const修饰的成员除外 静态成员函数 总结: static是 C/C中的关键字之一,是常见的函数与变量(C中还包括类…

Windows添加路由的方法

假设本来的局域网网关是192.100.10.1,现在要访问网关是192.100.20.0的服务器,可以手动添加路由。 方法: 1.以管理员的身份打开cmd命令窗口 2.输入 route add 192.100.20.0 mask 255.255.255.0 192.100.10.1 -p(最后加上-p就是…

如何在 Linux 上添加路由?

在 Linux 系统中,路由是网络通信的关键组件之一。通过添加路由,您可以指定数据包在网络中的传输路径,从而实现网络连接和数据转发。本文将详细介绍如何在 Linux 上添加路由,以便您可以根据需要配置网络路由并实现灵活的网络连接。…

Linux上添加路由,删除路由,修改路由配置(route add, route del, 路由表项基本知识)

路由基础知识: 是由一项或者多项路由表组成的,每个IP报文被发送前,系统都会查找主机路由表,决定将这个报文从 哪个网卡,发送到哪个下一跳。路由表项可以分成主机路由,网络路由和默认路由3种。每条路由表项…

【网络】route和 IP route的区别|route 和 IP route 添加路由

目录 route和 IP route的区别 route 和 IP route 显示路由 route 和 IP route 添加路由 route 添加路由 IP route 添加路由 添加的路由持久化 linux下添加路由的方法 使用 route 命令 使用ip route 命令 route和 IP route的区别 route是一个相当简单的工具,非常适合…

addRoute动态添加路由

项目进行到最后,突然通知说要使用动态路由,在网上找了一堆方法,发现不是要使用vuex就是要搭配缓存,这个时候完全不知如何下手,该怎么做简单一点呢? 先介绍一下项目需求,根据用户登录后返回的唯…

CentOS7添加路由

目录 一、route命令介绍 1、语法 2、命令使用举例 默认(网关)路由 主机路由 网络路由 二、ip 命令 三、永久添加路由条目(重启不会失效) 一、route命令介绍 命令用来显示并设置Linux内核中的网络路由表,设置的…

添加路由表

添加永久路由(网络重启后仍然有效) windows系统: 1.cmd打开控制台 2.输入:route add -p目的ip地址mask 子网掩码网关地址 ubuntu系统: 1.任意位置新建terminal输入: 2.sudo chmod 777 -R /etc/rc.local回车…

添加路由的2种方式--router

第一种cmd方法: 重新创建一个项目 添加路由: 打开文件夹 在路径栏里面输入cmd 打开cmd命令行 输入 vue create router-pro 选择下面选项 按下键选择路由并回车: 选择vue2版本 问你是否使用路由的历史模式: 输入n 问你eslint的语法规范选择…

内外网同时使用之添加路由

鉴于工作需要,开发的项目需要在内网中进行测试。但是出现bug时又需要在互联网中查询bug来源,在整个过程中,需要切换内外网,断了外网切内网,断了内网切外网,麻烦的不是一批。所以向项目经理请教了一下&#…

RANSAC算法原理与实现

参考原文: RANSAC算法学习笔记 重点内容: 算法流程: 1、在可以有(也可以没有,主要看应用场景)条件限制(比如选的子集里的点不能过远等)的情况下,随机选取子集&#xff…

深度解析RANSAC算法(精华修正版)

RANSAC算法看似简单,实际上还是有很多坑的,网上有一些关于RANSAC算法的介绍不准确,或者说不全面。 之前我写过一个rnsac算法简介的博客,那么这篇博客将带你再次填这个大坑! 目录 1. RANSAC算法论述 2. RANSAC算法…

利用RANSAC算法筛选SIFT特征匹配

关于RANSAC算法的基本思想,可从网上搜索找到,这里只是RANSAC用于SIFT特征匹配筛选时的一些说明。 RANSAC算法在SIFT特征筛选中的主要流程是: (1) 从样本集中随机抽选一个RANSAC样本,即4个匹配点对 (2) 根据这4个匹配点对计算变…

Ransac算法学习python版

初学小白,注释的代码比较详细 import numpy as np import scipy as sp import scipy.linalg as sldef ransac(data, model, n, k, t, d, debug False, return_all False):"""参考:http://scipy.github.io/old-wiki/pages/Cookbook/RANSAC伪代码:http://en.wi…

RANSAC算法实现 + 直线拟合

一、RANSAC算法 1.参考资料 [1]题目来源与解析:商汤科技SLAM算法岗的RANSAC编程题 [2]牛客网题目:[编程题]线性回归 [3]牛客网解答参考:商汤科技某算法岗的编程题有点过分了啊 [4]RANSAC算法原理:RANSAC翻译、经典RANSAC以及…

精匹配——Opencv实现RANSAC算法进行误匹配对剔除,并和最小二乘法对比

精匹配——RANSAC算法思想及优缺点 目录 精匹配——RANSAC算法思想及优缺点前言一、RANSAC简介二、RANSAC基本思想1.步骤2.迭代次数的公式3.举例(拟合直线,拟合最佳单应性矩阵) 三、最小二乘法1、最小二乘法的主要思想2、最小二乘解3、仿射变…