漫谈:C语言 C++ static究竟是什么

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


        C、C++麻拐得很,瞎球设计!

        “static”这个关键字在不同场合有不同的含义:

  • 表明这个变量或函数具有“内部链接”——就是别的文件看不见、不能用的意思
  • 表明这个变量或方法是“静态”的——其实是“全局”的意思

文件级变量和函数的static

        关于第一种情形,我们要知道C、C++是以C/CPP文件为单位编译,头文件会被直接嵌入展开成一个巨大的源文件,涉及到的变量(当然指的是全局变量)或者函数,或者在本文件里面有,或者在别的文件里,在别的文件里的,函数要有声明,变量则要一个带有extern的声明,告诉编译器这个东西的实现是在别的代码里面的。(为什么函数不需要extern?还是混乱嘛)

        编译器知道一个函数或变量在其他文件,就可以生成.o文件,然后链接的时候再去找具体的实现——找不到怎么办?链接报错——而不是编译报错。

        可是,如果并不想把某个函数或变量暴露给外部怎么办?比如自己随手添加一个,也不知道跟别的文件冲不冲突(两个CPP文件里面暴露同一个函数或变量就会导致链接错误,因为不知道该用哪一个),那怎么办呢?这就是static的用途:限制这个函数或变量只能在本文件内使用。

        (关于链接问题可以参看我的其他文章)

类的静态成员

        关于第二种情形,一个函数里面的静态变量或一个类的静态成员变量或静态成员函数,教科书上可以有各种解释,但究其本质,其实就是“全局”的意思:

        函数的静态成员变量就是一个全局变量,只不过只能在这个函数里面使用而已。

        类的静态成员变量就是一个全局变量,只不过要加上类名访问而已。而且确实是要在类的外面额外定义实现的,这跟全局变量简直就是一模一样。

        类的静态成员函数就是一个全局函数,只不过要加上类名访问而已。

为什么类的静态方法不能访问非静态成员

        从前面的分析就已经明白了,类的静态成员相当于是全局的,跟类的具体实例并没有关系,而类的非静态成员是跟具体实例相关的,所以显然静态方法是无法访问非静态成员的。

        非静态方法的参数实际上有一个隐含的this指针指向了具体实例,而静态方法调用是没有这个this指针的。

        初学者没有意识到静态成员的意义,就可能会把一些不涉及到类的非静态成员的方法写成普通方法,而不是静态方法。这样会导致调用这些方法的时候,不得不先创建一个无意义的对象实例。


(这里是结束)

        

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值