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

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

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

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


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

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

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

文件级变量和函数的static

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

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

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

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

类的静态成员

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

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

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

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

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

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

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

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


(这里是结束)

        

相关推荐

  1. 漫谈C语言 C++ static究竟什么

    2024-04-12 12:22:03       45 阅读
  2. PyTorch究竟什么

    2024-04-12 12:22:03       23 阅读
  3. 开发语言漫谈-C++

    2024-04-12 12:22:03       49 阅读
  4. 开发语言漫谈-C#

    2024-04-12 12:22:03       18 阅读
  5. 注意力机制 究竟什么

    2024-04-12 12:22:03       33 阅读
  6. 开发语言漫谈-C语言

    2024-04-12 12:22:03       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-12 12:22:03       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-12 12:22:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-12 12:22:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-12 12:22:03       20 阅读

热门阅读

  1. rocky9上安装Harbor私有仓库

    2024-04-12 12:22:03       15 阅读
  2. npm 错误,ERESOLVE unable to resolve dependency tree

    2024-04-12 12:22:03       40 阅读
  3. 【LeetCode热题100】41. 缺失的第一个正数(数组)

    2024-04-12 12:22:03       18 阅读
  4. 鸿蒙原生应用开发-网络管理模块总述

    2024-04-12 12:22:03       16 阅读
  5. 持续集成相关概念

    2024-04-12 12:22:03       19 阅读
  6. Android 10.0 电话记录为空号触发蓝牙重启问题解决

    2024-04-12 12:22:03       18 阅读
  7. 【笔试】输入输出处理

    2024-04-12 12:22:03       22 阅读
  8. HashMap面试题

    2024-04-12 12:22:03       17 阅读
  9. Composer安装与配置

    2024-04-12 12:22:03       16 阅读