首页 > 其他分享 >static 详解

static 详解

时间:2022-10-15 19:24:29浏览次数:92  
标签:初始化 变量 静态 int 详解 static 函数

主要参考:C/C++ 中 static 的用法全局变量与局部变量
其他参考:C 语言中 static 的作用

静态变量

静态变量的作用:限定此变量的使用范围,并在限定访问内共享此变量,具体如下:

  • 函数内定义的静态变量:对函数内定义的静态变量的修改会保存到下一次调用,并且此静态变量只属于本函数
  • 类中的成员变量定义为静态变量:类中的成员变量定义为静态变量,此变量为类变量,被全体对象所共享。
  • static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是 extern 外部声明也不可以。

全局(静态)存储区:分为 DATA 段和 BSS 段。

  • DATA 段(全局初始化区)存放初始化的全局变量和静态变量,根据设定的值初始化。
  • BSS 段(全局未初始化区)存放未初始化的全局变量和静态变量,程序执行之前会被系统自动清0。

存储在静态数据区的变量会在程序运行前就完成初始化,也是唯一的一次初始化(如果再次进行了初始化将会被忽略)。所以不管是在类内、函数内或者其他地方定义的静态变量都是在程序运行前就分配空间和初始化。

下面对上面的一些结论进行举例说明:
说明1:
函数内定义的静态变量:对函数内定义的静态变量的修改会保存到下一次调用,并且此静态变量只属于本函数。举例如下:

#include <stdio.h>

int fun(void){
    static int count=10;    // 事实上此赋值语句从来没有执行过
    return --count;
}

int fun2(){

    static int count=-5;    // 事实上此赋值语句从来没有执行过
    return --count;

}


static int count = 1;
int main(void)
{   
   	
    printf("%d\n", fun());    
    printf("%d\n", fun2());    
   
    printf("%d\n", fun());    
    printf("%d\n", fun2());    
    return 0;
}

输出:

9
-6
8
-7

说明2:
存储在静态数据区的变量会在程序运行前就完成初始化,也是唯一的一次初始化(如果再次进行了初始化将会被忽略)。举例如下:

#include <stdio.h>

int fun(void){
    static int count=10;    // 只在运行前进行初始化操作,再次进行了初始化将会被忽略。
                            // 也就是说此段赋值代码在运行期间没有被执行过。
    return count--;
}

int count = 1;
int main(void)
{    
    printf("global\t\tlocal static\n");
    for(int i=0; i <= 10; ++i)
        printf("%d\t\t%d\n", count, fun());    
   
    return 0;
}

其他:

  • 考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用 static)。

静态函数

全局的静态函数只能在本文件中使用。

静态成员函数:

  • 不能通过类名来调用类的非静态成员函数。
  • 静态成员函数中不能引用非静态成员,因为静态成员函数属于整个类,在类实例化对象之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,就好比没有声明一个变量却提前使用它一样。
  • 非静态成员函数可以调用用静态成员函数,但反之不能。
  • 非静态成员函数有隐含this 指针作为形参,而静态成员函数没有隐含this 指针。

两个注意点

【注意点一】:记得定义静态成员变量

#include <stdio.h>  
class Point  
{  
public:   
    Point()  
    {    
        m_nPointCount++;  
    }  
    ~Point()  
    {  
        m_nPointCount--;  
    }  
    static void output()  
    {  
        printf("%d\n", m_nPointCount);  
    }  
private:  
    static int m_nPointCount;  
};  
void main()  
{  
    Point pt;  
    pt.output();  
}

m_nPointCount只进行了声明没有定义,所以编译的时候会提示m_nPointCount没有定义。
extern、关于C++的变量和类的声明和定义中有提到类中成员变量的声明和定义的相关概念。

【注意点二】静态变量和其他变量的名字不能一样

#include <stdio.h>

int main(void)
{    
    int count = 1;
    static int count=10;
    return 0;
}

出现重定义错误。

static修饰类

static 修饰类:static 一般情况下来说是不可以修饰类的, 如果 static 要修饰一个类,说明这个类是一个静态内部类(注意 static 只能修饰一个内部类),也就是匿名内部类。
【注】内部类也就是内部的类,是包含在一个类里面的类

标签:初始化,变量,静态,int,详解,static,函数
From: https://www.cnblogs.com/codingbigdog/p/16794826.html

相关文章

  • 153-《大数据架构师》Flink Task 部署、初始化和启动详解_ev
                                                     ......
  • 【算法】KNN、SVM算法详解!
    什么是KNN算法寻找未知分类数据的离它最近的n个已知数据,通过已知数据的分类来推断这个未知数据的分类KNN的原理步骤计算距离(常用欧几里得距离或马氏距离)升序排列(最近......
  • Python库-pandas详解
    1.pandas介绍 pandas是用于数据挖掘的Python库 便捷的数据处理能力独特的数据结构读取文件方便封装了matplotlib的画图和numpy的计算pandas的数据结构Ser......
  • 【数据库】oracle初学知识点详解!
    一、关系数据库基础(20)1.关系型数据库基本知识:关系模型以及模型的层次结构:数据库系统、数据库管理系统的基本概念及其基本组成;E-R图;关系数据库设计数据库系统的概念:数据库......
  • Linux文件系统与日志分析详解
    一、inode(索引节点/i节点)与block(块)1.inode与block的概念1.1什么是block?文件储存在硬盘上的,硬盘最小的存储单位叫“扇区”,每个扇区存储512个字节一般连续8个扇区会组......
  • 详解降维-SVD角度看PCA和PCoA & 主成分分析-概率角度(Probabilistic PCA)【白板推导系列
    前一节说明了重构特征空间找什么方向的向量,本节讲的是如何重构特征空间,即通过特征分解(SVD) 对于中心化的数据矩阵$HX$进行SVD$$HX=U\SigmaV^{T}\quad\left{\begin{al......
  • maven生命周期详解说明
    转自:​​http://www.java265.com/Maven/202204/3220.html​​ 下文笔者讲述maven生命周期的详解说明,如下所示:Maven生命周期Maven生命周期:对所有的构建过程进行抽象和......
  • SQL索引详解
    一、什么是索引 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的特殊数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据......
  • 很多优化器详解(原理+代码)
    https://blog.csdn.net/tcn760/article/details/123965374?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-......
  • 肖sir__java__Java访问控制修饰符详解(public、 private、protected 和 friendly)
    1、  1.private用private修饰的类成员,只能被该类自身的方法访问和修改,而不能被任何其他类(包括该类的子类)访问和引用。因此,private修饰符具有最高的保护级别。例......