• static关键字总结-C/C++


    引言:由于怕忘记static的一些区别,今天来写一篇文章尽可能的覆盖到static在C/C++中的用法和易错点。

    第一部分  C中的static

    1. static修饰变量 

    被修饰的变量只能被定义一次,如下代码,n经过循环后仍然还是10。

    1. #include
    2. int main() {
    3. static int n = 10;
    4. for (int i = 0; i < 10; i++) {
    5. int n = 10 + i;
    6. }
    7. printf("n:%d", n);
    8. return 0;
    9. }

     

    2. static修饰全局变量

    • 静态全局变量被存储在数据区的 静态区(数据段)。
    • 静态全局变量链接属性变为内部链接作用域因此被限制在本文件,变量只可在本文件中被访问。
    1. test.c
    2. static int a = 0;
    1. main.c
    2. #include
    3. extern int a;
    4. int main() {
    5. printf("a:%d\n", a);
    6. return 0;
    7. }

     这里就会编译器就会报错,其在链接时,无法解析外部符号a.

    3. static修饰函数

     与静态全局变量相似,静态函数为内部链接,只能在声明它的文件中被调用。 

     第二部分  C++中的static

    1.  修饰类的成员函数

    可以看出:编译器报错了,因为被静态修饰的成员函数无法访问除静态成员变量的成员变量。(它的形参少了一个this指针)

    可以访问静态成员变量h 

    2.  修饰类的成员变量 

    上面,我们在Date 类中声明了一个static int h,但是C++规定,静态成员变量在类中只能声明,需要在类外面去初始化

     同时C++11规定除静态成员变量外,其他成员变量可以在类中声明并初始化,如下:

     访问静态成员变量同样需要突破类域和访问限定符。即不可以下面这样!

     

    3. 修饰类的成员常量 

    在上一篇实现string的文章中, 我们定义了一个静态成员常量 npos

    1. class string{
    2. public:
    3. typedef char* iterator;
    4. //
    5. //
    6. //
    7. private:
    8. char* _str; // 用于保存字符串
    9. int _size; // 字符串长度
    10. int _capacity; // 容量
    11. static const size_t npos = -1; // 表示找不到
    12. };

    你可能会有疑问为啥这个可以在类中进行定义,好问题!

    因为这是C++的规定,允许整型const static 可以在类的定义体中定义并初始化。另外,由于字符型其实就是整型,所以它也可以在类中进行定义初始化。

     ​​​

  • 相关阅读:
    springboot异步线程池
    【考研数学】四. 多元函数微积分
    zookeeper+kafka消息队列群集部署
    软考证书具体用途--详细介绍
    论文阅读 DynGEM: Deep Embedding Method for Dynamic Graphs
    GEO生信数据挖掘(九)肺结核数据-差异分析-WGCNA分析(900行代码整理注释更新版本)
    提升后端API性能的几种解决方案
    【译】IntelliJ IDEA 2023.2 最新变化——JetBrains IDE 中的 AI 助手
    【代码精读】optee的Early TA介绍–如何添加一个Early TA
    Docker(四)、容器间通信
  • 原文地址:https://blog.csdn.net/weixin_56821642/article/details/133916342