前言

这里简单记录一下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
暂无评论...