Chinaunix首页 | 论坛 | 博客
  • 博客访问: 268509
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: C/C++

2015-07-16 20:24:08

一、static内部机制:
static被引入就告知编译器,将变量存储在程序的静态存储区(而非栈空间),静态数据成员啊哈定义出现的先后次序初始化;
凡是有static定义的变量的生命周期就是整个程序的生命周期,直到程序退出,静态变量所占据的内存才会被释放。
二、static变量
1 静态局部变量
静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量(main函数中定义的static变量,不能在main中调用的函数中使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。
(2)允许对构造类静态局部量赋初值 例如数组,若未赋以初值,则由系统自动赋以0值。
(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
根据静态局部变量的特点, 可以 看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的 值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成 意外的副作用,因此仍以采用局部静态变量为宜。
2.静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局 变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在 定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此 可以避免在其它源文件中引起错误。
    
从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量 后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

三、static类成员
1、总概
    类的对象构建过程不会动到static变量和函数,因为它存在静态内存。
    因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。
    因为static数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员),也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。
    static数据成员必须在类定义体的外部定义(正好一次)。不像普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。
2.使用static的优点
    static成员的名字是在类的作用域中,避免与其他类的成员或全局对象名字冲突;
    实施封装。static可以是私有的(全局对象做不到)
    static成员与特定类有关联;
3 使用类的static成员
    类作用域外访问:
        通过类的作用域操作符来直接使用static成员;或 通过对象、引用、指针来间接访问;
    类作用域内:
        不需要作用域操作符,直接访问;
4 static成员函数
    static成员函数不能声明为const;(const成员函数意味着成员函数不会修改所属对象)
    static成员函数不能声明为virtual
5.static数据成员
    整型 const static数据成员可以在类的定义体中初始化;(即使这样,还是需要在类定义体外进行成员定义);
    static数据成员的类型可以是该成员所属类的类型;非static成员只能被限定声明为该类对象的引用或指针;
    非static数据成员不能用作默认实参(因为它的值不能独立于对象而使用),但static数据成员可以用作默认实参;
阅读(862) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~