精华内容
下载资源
问答
  • c语言中static关键字用法详解

    万次阅读 多人点赞 2018-04-05 18:18:14
    static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。 但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏...

    概述

    static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。

    但是对于c语言初学者,static由于使用灵活,并不容易掌握。本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。

    最后一节加入了c++面向对象中static的使用特性,当作拓展阅读。


    在程序中使用static

    变量

    1. 局部变量

    普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。

    普通局部变量存储于进程栈空间,使用完毕会立即释放。

    静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

    变量在全局数据区分配内存空间;编译器自动对其初始化
    其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束

    小程序体会一下静态局部变量的威力:

    #include <stdio.h>
    
    void fn(void)
    {
        int n = 10;
    
        printf("n=%d\n", n);
        n++;
        printf("n++=%d\n", n);
    }
    
    void fn_static(void)
    {
        static int n = 10;
    
        printf("static n=%d\n", n);
        n++;
        printf("n++=%d\n", n);
    }
    
    int main(void)
    {
        fn();
        printf("--------------------\n");
        fn_static();
        printf("--------------------\n");
        fn();
        printf("--------------------\n");
        fn_static();
    
        return 0;
    }
    

    运行结果如下:

    -> % ./a.out 
    n=10
    n++=11
    --------------------
    static n=10
    n++=11
    --------------------
    n=10
    n++=11
    --------------------
    static n=11
    n++=12
    

    可见,静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。

    2. 全局变量

    全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。

    普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

    静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

    在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

    函数

    函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:

    • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
    • 不同的文件可以使用相同名字的静态函数,互不影响

    非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明

    下面两个文件的例子说明使用static声明的函数不能被另一个文件引用:

    /* file1.c */
    #include <stdio.h>
    
    static void fun(void)
    {
        printf("hello from fun.\n");
    }
    
    int main(void)
    {
        fun();
        fun1();
    
        return 0;
    }
    
    /* file2.c */
    #include <stdio.h>
    
    static void fun1(void)
    {
        printf("hello from static fun1.\n");
    }
    

    使用 gcc file1.c file2.c编译时,错误报告如下:

    /tmp/cc2VMzGR.o:在函数‘main’中:
    static_fun.c:(.text+0x20):对‘fun1’未定义的引用
    collect2: error: ld returned 1 exit status
    

    修改文件,不使用static修饰符,可在另一文件中引用该函数:

    /* file1.c */
    #include <stdio.h>
    
    void fun(void)
    {
        printf("hello from fun.\n");
    }
    
    /* file2.c */
    int main(void)
    {
        fun();
    
        return 0;
    }
    

    同样使用 gcc file1.c file2.c编译,编译通过,运行结果如下:

    -> % ./a.out 
    hello from fun.
    

    面向对象

    静态数据成员

    在类内数据成员的声明前加上static关键字,该数据成员就是类内的静态数据成员。其特点如下:

    • 静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义
    • 静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。
    • 由于上面的原因,静态数据成员不属于任何对象,在没有类的实例时其作用域就可见,在没有任何对象时,就可以进行操作
    • 和普通数据成员一样,静态数据成员也遵从public, protected, private访问规则
    • 静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
    • 类的静态数据成员有两种访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

    同全局变量相比,使用静态数据成员有两个优势:

    • 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性
    • 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能
    静态成员函数

    与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象,其特性如下:

    • 静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数
    • 出现在类体外的函数定义不能指定关键字static
    • 非静态成员函数可以任意地访问静态成员函数和静态数据成员

    总结

    static是一个很有用的关键字,使用得当可以使程序锦上添花。当然,有的公司编码规范明确规定只用于本文件的函数要全部使用static关键字声明,这是一个良好的编码风格。

    无论如何,要在实际编码时注意自己的编码习惯,尽量体现出语言本身的优雅和编码者的编码素质。

    展开全文
  • static关键字

    2020-10-05 20:26:26
    一旦使用了static关键字,那么使用了static关键字的内容属于当前的类,只要是本类的对象,都能共享类使用了static关键字的内容 二、静态static关键字修饰成员变量 如果一个成员变量使用了static关键字,那么这个变量...

    一、static关键字概述

    一旦使用了static关键字,那么使用了static关键字的内容属于当前的类,只要是本类的对象,都能共享类使用了static关键字的内容

    二、静态static关键字修饰成员变量

    如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。本类对象都能共享这个成员变量

    三、静态static关键字修饰成员方法

    一旦使用了static关键字修饰成员方法,那么这就成为了静态方法。静态方法不属于对象,而是属于类的。
    如果没有static关键字,那么当我们想调用成员方法时,我们必须创建一个对象,然后通过这个对象才能使用它
    如果使用了static关键字修饰了成员方法,该方法成为了静态方法,当我们想调用静态方法的时候,我们可以通过对象来使用它,也可以通过类名称来调用它


    注意:

    1、当使用了static关键字修饰后,我们都推荐使用类名称进行调用,这样不会误以为是成员变量或者成员方法:
    静态变量:类名称.静态变量
    静态方法:类名称.静态方法()
    2、对于本类当中的静态方法我们在调用的时候,直接写方法名称也可以运行,可以省略类名称
    3、静态不能直接访问非静态,原因是在内存当中现有的静态内容,后有的非静态内容“后人知道先人,先人不知道后人”
    4、静态方法中不能使用this,原因this代表当前对象,通过谁调用的方法,谁就是当前对象,调用静态方法的时候是通过当前类调用的,而不是通过对象,即使写法是对象调用的静态方法,在编译的时候也会被javac翻译成类调用静态方法


    四、静态static的内存图

    public static void main (String[] args) {
    	Student.room = "101教室";
    	Student.one = new Student(name:"郭靖", age:20);
    	Student.two = new Student(name:"黄蓉", age:18);
    }
    

    我们有一个类,类中有name和age的构造方法,和静态变量room,这里我们这是静态变量room为101教室,并且创建了两个对象,分别初始化了他的name和age
    通过这个例子我们来观察内存中发生的变化,大致如下:
    在这里插入图片描述

    得到如下结论:

    根据类名称访问静态成员变量的时候,全过程和对象无关系,只和类有关系


    五、静态代码块

    1、静态代码块的格式为
    静态代码块直接在类当中

    public class 类名称 {
    	static {
    		// 静态代码块的内容
    	}
    }
    

    2、静态代码块的特点
    ① 当第一次使用含有静态代码块的类时,静态代码块只执行唯一的一次,第二次用到这个类的时候静态代码块不执行
    ② 静态内容总是优先于非静态内容,所以静态代码块比构造方法先执行

    3、静态代码块的用途:
    用来一次性的对静态成员变量进行赋值

    展开全文
  • static 关键字

    2020-08-18 13:31:41
    static 关键字

    修饰成员变量或方法,随着类被加载而加载,且只加载一次,被所有对象共享。

    static 修饰静态块,先于构造方法被执行。

    展开全文
  • Static关键字

    2021-03-29 23:06:53
    Static关键字一、static关键字是什么意思?二、Java中是否可以覆盖(override)一个private或者是static的方法? 一、static关键字是什么意思? static是静态的意思,用于修饰成员变量和成员方法,被静态修饰的成员...

    一、static关键字是什么意思?

    static是静态的意思,用于修饰成员变量和成员方法,被静态修饰的成员不能访问非静态的成员,静态成员属于类,随着类的加载而加载,可以直接被类名调用。

    二、Java中是否可以覆盖(override)一个private或者是static的方法?

    重写
    是子类对父类总的方法进行重新编写,即外壳不变,核心重写,要求子类和父类方法的返回值、方法名、参数值、参数类型必须一致。
    private方法
    是类的私有方法,只能类的内部被访问,不参与继承,所以不能被重写。
    static方法
    不能被重写分为两方面原因:
    一方面重写是为了实现子类实例的特殊化,但静态方法属于类本身的,不属于实例,所以不能被重写:
    另一方面重写的前提是实例调用方法,由其实际类型所决定,是***动态绑定***,但static方法的调用却是由声明类型所决定,是***静态绑定***,所以不能被重写。

    展开全文
  • 深入理解static关键字

    万次阅读 多人点赞 2019-10-25 09:08:13
    提到static关键字,相信大家都不陌生,这是相对比较难以理解的一个关键字,相信各位也都能深深感受的到!本篇文章将好好总结一下static这个关键字。 文章目录1、static存在的主要意义2、static的独特之处3、静态...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,720
精华内容 16,688
关键字:

static关键字