C++ 关键字:static

介绍

在 C++ 中,static 意为静态,通常声明在变量或函数前面。

作用

(1)在函数内的局部变量声明前添加 static 关键字,使其变量的生命周期变为全局,直到程序结束时才释放。
(2)在源文件的普通函数和全局变量前添加 static 关键字,使其变为只供当前文件内部使用。
(3)在类中的成员函数和变量前声明 static 关键字,使其可以直接在类外调用,并且定义的类对象调用的静态成员函数或变量都为同一个(全局生命周期)。

用法

在局部变量前声明

代码如下:

// C++ 标准库 ios 头文件,用于 std::cout 将数据打印到屏幕 std 为 C++ 标准库的命名空间
#include <iostream> 

void Print()
{
    static int value = 0; //value变量声明,只会在第一次调用时执行此句代码进行初始化
    std::cout << "value的地址为: " << &value << std::endl; //打印变量 value 的地址
    std::cout << "value的值为: " << value++ << std::endl; //打印 value++ 的值,由于是后++,此句代码会打印++前的值,执行完此句代码才会使 value 的值 +1
}
//主函数
int main()
{
    //调用两次打印函数,
    Print();
    Print();
    //暂停查看打印的数据,防止程序直接退出。
    system("pause");

    return 0;
}

输出结果如下:

根据输出结果可以看出声明了 static 的 int 变量 value 的命周期为全局,调用两次的情况下地址相同,并且值是根据前一次的结果 ++ 后打印的。

在全局范围中声明

代码如下:
static.h:

#pragma once

#include <iostream>

extern int value;

static void testPrint();

static.cpp:

#include "static.h"
#include <iostream>

static int value = 0;

static void testPrint(){
    std::cout << "testPrint" << std::endl;
}

main.cpp:

#include "static.h"

int main()
{
    value = 1;
    testPrint();

    return 0;
}

编译结果:


根据编译结果得知:在源文件的全局函数和变量前声明 static 关键字,其函数或变量将只能在本文件中使用,其他文件中无法找到。

在类中声明

代码如下:

// C++ 标准库 ios 头文件,用于 std::cout 将数据打印到屏幕 std 为 C++ 标准库的命名空间
#include <iostream>

//类定义
class Static{

public:
    static void Print()
    {
        static int num = 0;

        std::cout << num++ << std::endl;
    }

    static int value;
};

// 初始化类 Static 的静态成员
int Static::value = 0;

//主函数
int main()
{
    //类对象声明
    Static m_staticA, m_staticB;

    //修改静态成员变量 value 的值并打印
    Static::value = 3;
    std::cout << "m_staticA.value = " << m_staticA.value << std::endl;//3
    m_staticA.value = 5;
    std::cout << "m_staticB.value = " << m_staticB.value << std::endl;//5
    std::cout << "Static::value = " << Static::value << std::endl;//5

    //打印静态变量 value 在不同的对象中的地址
    std::cout << "&Static::value = " << &Static::value << std::endl;
    std::cout << "&m_staticBvalue = " << &m_staticB.value << std::endl;
    std::cout << "&m_staticA.value = " << &m_staticA.value << std::endl;

    //执行静态成员函数
    //Static::Print();//0
    m_staticA.Print();//1
    m_staticB.Print();//2

    //暂停查看打印的数据,防止程序直接退出。
    system("pause");

    return 0;
}

输出结果如下:

总结

(1)static 关键字使变量或函数的生命周期变为全局。
(2)在源文件的全局变量或全局函数前添加 static 关键字,会使其的作用域限定在本文件内。
(3)在类的成员变量或成员函数前添加 static 关键字,可以直接在类外访问(在public声明下),声明周期也为全局并且此类的所有对象共享它们(只占一份内存)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值