static用途

static的用途:限制变量的作用域(隐藏):当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 如果加了static,就会对其他源文件隐藏;利用这一特性,就可以在不同的源文件中定义同名变量和函数而不用担心会发生命名冲突;

 隐藏用途的例子:

// a.c 文件
char a = 'A'; // global variable
void msg() 
{
    printf("Hello\n"); 
}
// main.c文件
int main(void)
{    
    extern char a;    // extern variable must be declared before use
    printf("%c ", a);
    (void)msg();
    return 0;
}
运行结果:A Hello

在a.c中的变量a和函数msg()前面加上static,那么a.c中的a和msg对main.c中就是不可见的了;

对于static变量,static还有以下两个作用:1) 保持变量内容的持久(如果在一个函数内定义一个static变量,则其生存期是整个源程序,但其作用域仍是在函数内部使用,退出该函数时,该变量不会被销毁,仍然保持它的值,知道整个程序退出,该变量才会销毁);2) 默认初始化为0(在静态数据区,内存中所有的字节默认值都是0x00);


一:

1、 定义全局静态变量:在全局变量前面加上static,该全局静态变量有以下特点:

        1) 在全局数据区内分配内存;  2) 如果没有初始化,其默认值为0;  3) 该变量在本文件内从定义开始到文件结尾处都可见,在本文件外不可见;而全局变量在本文件之外的其              他文件中也可见;

2、定义局部静态变量:在局部静态变量前面加上static,静态局部变量有以下特点:

       1) 在全局数据区分配内存;2) 如果没有初始化,那么将被隐式初始化为0;3) 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;

3、定义静态函数:在函数的返回类型上加上static关键字,有一下特点:

       1) 静态函数只能在本源文件中使用,


二:static类成员

使用类的static成员的优点:

1)static成员的名字在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突;

2)可以实施封装。static成员可以是私有成员,而全局对象不可以;


1、static成员变量:

       内存分配:在全局数据区分配内存; 

       初始化和定义:static数据成员定义时要分配空间,所以不能在类声明中定义;

       作用域:static成员变量被类的所有对象所共享;

       无this指针;

2、static成员函数:

       静态成员函数不能访问非静态的成员变量和非静态的成员函数;

       在类外,static成员变量初始化 和static成员函数实现都不要加staic;


三:另外的一些知识:

        static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

       全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无   不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。


从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件


static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值