1418|0

6822

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

Static关键字所有用法详解 [复制链接]

以前总是对static的涵义模棱两可,不太敢用,也不知道什么地方该用。其实static用法非常广泛,静态变量、静态成员、静态函数等,如果用的好,会使程序提升一个等级,并且可以解决很多实际问题,比如单例模式…而且静态数据成员存储在静态存储区,只存储一次,可以节省内存。所以在这里尽自己目前的理解做一个总结:

用法1:static局部变量

我的理解是有点类似全局变量的功能,但只能被赋值一次,也就是说函数第一次赋值之后,会一直保存这个值。

void f()
{
    static int st=10;
    st++;
    cout< }
int main()
{
    f();
    f();
    f();
}
输入结果为:11
          12
          13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
用法2:static全局变量

静态全局变量和静态局部变量类似,只是作用域不同,都是存储在全局数据区。
关于存储区:new产生的动态数据存储在堆去;自动变量存储在栈去,会自动释放;而静态变量和全局变量存储在全局存储区,不会随函数退出而释放。
与一般全局变量的区别:

static全局变量只初始化一次
仅能在本文件中使用,其它文件可以定义相同名字的变量
用法3:static函数

只要记住一点:静态函数与普通函数的区别,只能在声明它的地方可见,不能被其它文件所使用

static void f();
int main()
{
    f();
}
void f()
{
    cout<<"fuck"< }
1
2
3
4
5
6
7
8
9
总结1:若全局变量仅在单个文件中可用,则声明为static全局变量,若全局变量仅在单个函数内部可用,则声明为static局部变量。

OK,讲完了面向过程,该轮到面向对象了,这也是我觉得static比较精华的地方。

用法4:static数据成员

静态成员可供所有的对象访问,只分配一次内存,也只有一份拷贝,对于每个对象都是一样,它的值可以更新;
静态成员存储在全局数据区,因此不能类声明中定义,初始化规则:<数据类型><类名>::<静态数据成员名>=<值> ,在使用前必须初始化;
访问:通过对象或者类名来访问;
静态成员的访问符和普通成员一样:public、protected、private;
作用:

实现全局性,但不会与程序中其它全局名字冲突
与private搭配,可实现信息隐藏
一个计数的例子

class Example
{
public:
    static int count;
    Example() {
        count++;
    }
};
int Example::count = 0;
int main()
{
    Example e1,e2;
    cout< }
输出:2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
用法5:static成员函数

与静态成员类似,它是类内部共同享用,和普通函数不同,静态成员函数没用this指针;
访问:与静态成员类似通过类名或对象;
非静态成员函数可以任意地访问静态成员函数和静态数据成员,但反过来不行;
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
class Example
{
private:
    int m1;
public:
    static int count;
    Example() {
        count++;
    }
    static void f1();
    void f2()
    {
        f1();//OK
    }
    void f3();

};
void Example::f1()
{
    cout << m1 << endl;//错误调用
    f3();//错误调用
    cout << count << endl;//OK
}

 
点赞 关注(1)

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表