前言

这里简单记录一下C++static关键相关内容,记录于此,方便自己查阅。

正文

作用

关键字static主要用于改变变量或函数的存储方式,从而改变其作用域和生命周期。

初始化

初始化只有一次,但是可以多次赋值。

在主程序之前,编译器已经为其分配好了内存。静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,但在C语言和C++中静态局部变量的初始化节点又有点不太一样。

  1. C语言:编译阶段就分配好内存并初始化。

  2. C++:首次使用静态变量时才会进行初始化。

使用场景

  1. 修饰局部变量

    static修饰函数内部的局部变量时,把变量的生命周期会延长至整个程序运行期间,但其作用域仍然局限于该函数内部

    void test() {
        static int age_static;
        std::cout << age_static << std::endl;
    }
    
    int main()
    {
        //std::cout << age_static << std::endl; //提示未定义
        test();
    }
  2. 修饰全局变量

    static修饰全局变量时,该变量的作用域会被限制在定义它的文件内部,其他文件时不可见的,也无法访问!

    //two.cpp
    static int age = 101; //错误,无法链接,只能在two.cpp中可见。
    int age = 101; //正确,one.cpp中可以通过extern 访问。
    //one.cpp
    #include <iostream>
    int main()
    {
        extern int age;
        std::cout << age << std::endl;
    }

    上面int age不使用static修饰就OK,使用了static修饰就无法编译成功。

  3. 修饰函数

    static修饰的函数即被称为静态函数。静态函数与普通函数不同,它只能在声明它的文件当中可见,不能被其它文件使用。

    案例一和案例二是不同的写法!

    案例一

    two.cpp

    //two.cpp
    #include <iostream>
    
    //使用static修饰就无法正常编译,提示无法解析
    //static void forTest() {
    //  std::cout << "forTest" << std::endl;
    //}
    
    void forTest() {
        std::cout << "forTest" << std::endl;
    }

    one.cpp

    //one.cpp
    #include <iostream>
    void forTest();//声明未定义
    int main()
    {
        forTest();
    }
    案例二

    Hello.h

    //Hello.h
    #pragma once
    void sendHello();

    Hello.cpp

    //Hello.cpp
    #include "Hello.h"
    #include <iostream>
    
    void sendHello() {
        std::cout << "Hello world ^_^" << std::endl;
    }

    One.cpp

    #include "Hello.h"
    #include <iostream>
    
    int main()
    {
        sendHello();
    }
  4. 修饰类成员

    1. 静态成员变量

      static修饰类的成员变量时,该成员不仅属于类对象,也属于类,并且共享同一个静态数据成员。

    2. 静态成员函数

      和上面一样,不仅属于类对象,也属于类。静态成员函数只能访问类的静态数据成员和其他静态成员函数,不能访问非静态成员。

      1. C++ 独有类

      2. 非静态成员函数可以任意地访问静态成员函数和静态数据成员

      后面会单独介绍,略。

生命周期

  • 静态局部变量‌:作用域在函数内部,生命周期在整个程序运行期间。

  • 静态全局变量‌:作用域在定义它的文件内部,生命周期在整个程序运行期间。

  • 静态类成员‌:作用域在整个类内部,生命周期在整个程序运行期间(对于静态数据成员而言)。

优缺点

优点
  • 静态局部变量可以在函数调用之间保持值,避免重复初始化。

  • 静态全局变量和函数可以实现文件隔离,避免命名冲突。

  • 静态类成员可以实现所有对象共享的数据或函数。

缺点
  • 静态成员函数不能访问类的非静态成员,因为它们属于类本身而非某个具体对象。

  • 静态全局变量和函数可能会增加程序之间的耦合度,因为它们只能在定义它们的文件中访问和修改。

参考文章

  1. 《C++从入门到精通(第6版)》

  2. 文心快码

  3. C++中的static关键字

相关文章

暂无评论

none
暂无评论...