c++ static详细使用分析

 更新时间:2024年05月20日 11:46:09   作者:激昂~逐流  
在C++中,static是一个关键字,用于声明静态成员、静态局部变量以及静态函数,这篇文章主要介绍了c++ static详细分析,需要的朋友可以参考下

一.定义

在C++中,static是一个关键字,用于声明静态成员、静态局部变量以及静态函数。

二.各种类型分析

1.静态成员变量:

  • 静态成员变量是类的属性,它在所有类实例之间共享,只有一个副本。
  • 静态成员变量在类内声明,在类外定义和初始化。
class MyClass {
public:
    static int count; // 静态成员变量声明
};
int MyClass::count = 0; // 静态成员变量定义和初始化
int main() {
    MyClass obj1;
    MyClass obj2;
    obj1.count = 2;
    cout << obj2.count; // 输出为2,因为count是静态成员变量,被所有类实例共享
    return 0;
}

2.静态局部变量:

  • 静态局部变量在函数内部声明,并在程序的整个生命周期内保持其值,而不是在每次函数调用时重新初始化。
  • 静态局部变量只在函数第一次被调用时初始化,之后保持其值。
void myFunction() {
    static int count = 0; // 静态局部变量
    count++;
    cout << count << endl;
}
int main() {
    myFunction(); // 输出1
    myFunction(); // 输出2
    myFunction(); // 输出3
    return 0;
}

3.静态函数:

  • 静态函数是属于类的函数,不依赖于类的实例,可以直接通过类名调用。
  • 静态函数不能访问非静态成员变量,只能访问静态成员变量。
class MyClass {
public:
    static void myStaticFunction() {
        cout << "This is a static function." << endl;
    }
};
int main() {
    MyClass::myStaticFunction(); // 直接通过类名调用静态函数
    return 0;
}

三.实际开发中static的用法

1.单例模式(Singleton Pattern):

使用静态成员函数和静态成员变量创建单例类,确保只有一个实例存在。
class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance;
        return instance;
    }
    void doSomething() {
        // ...
    }
private:
    Singleton() {} // 私有构造函数,防止外部创建实例
};
int main() {
    Singleton& obj = Singleton::getInstance();
    obj.doSomething();
    return 0;
}

2.计数器变量:

使用静态成员变量实现计数器功能,用于统计类的实例数量。
class Counter {
public:
    Counter() {
        count++;
    }
    ~Counter() {
        count--;
    }
    static int getCount() {
        return count;
    }
private:
    static int count; // 静态成员变量
};
int Counter::count = 0; // 静态成员变量初始化
int main() {
    Counter obj1;
    Counter obj2;
    cout << Counter::getCount() << endl; // 输出2
    return 0;
}

3.辅助函数:

使用静态函数作为辅助函数,不依赖于类的实例,可以直接调用。
class MathUtils {
public:
    static int add(int a, int b) {
        return a + b;
    }
};
int main() {
    int sum = MathUtils::add(5, 3); // 调用静态函数
    cout << sum << endl; // 输出8
    return 0;
}

4.缓存数据:

使用静态局部变量作为缓存,避免重复计算或频繁的资源获取操作。
int getData() {
    static int cache = fetchData(); // 静态局部变量作为缓存
    return cache;
}
int main() {
    int data = getData(); // 第一次调用需要获取数据
    data = getData(); // 后续调用直接使用缓存数据
    return 0;
}

四.static内存分配

在C++中,静态成员变量和静态局部变量的内存分配时机是不同的。

1.静态成员变量的内存分配:

  • 静态成员变量在程序启动时进行内存分配,无论是否创建类的实例。
  • 内存分配发生在程序的静态数据区(static data segment)。
  • 静态成员变量的初始化在其首次使用之前进行,通常在程序启动时进行。

2.静态局部变量的内存分配:

  • 静态局部变量在其所在的函数第一次被调用时进行内存分配。
  • 内存分配发生在程序的静态数据区。
  • 静态局部变量只在首次调用时进行初始化,之后保持其值。

需要注意的是,静态局部变量和静态成员变量的内存分配和初始化时机是在编译时确定的,与程序的执行流程无关。静态局部变量和静态成员变量的生命周期和作用域与其所在的函数或类相关。

另外,静态局部变量和静态成员变量的作用域是在定义它们的函数或类范围内可见。静态局部变量的作用域是局部的,只在定义它们的函数内可见。而静态成员变量的作用域是类级别的,可以通过类名访问。

总结起来,静态成员变量在程序启动时进行内存分配和初始化,而静态局部变量在其所在函数第一次被调用时进行内存分配和初始化。

到此这篇关于c++ static详细分析的文章就介绍到这了,更多相关c++ static内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt 自定义属性Q_PROPERTY不显示float类型的解决

    Qt 自定义属性Q_PROPERTY不显示float类型的解决

    这篇文章主要介绍了Qt 自定义属性Q_PROPERTY不显示float类型的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 如何给随机数加密

    如何给随机数加密

    随机数加密的简单算法,需要的朋友可以参考一下
    2013-03-03
  • C语言创建数组实现函数init,empty,reverse

    C语言创建数组实现函数init,empty,reverse

    这篇文章主要介绍了C语言创建数组实现函数init,empty,reverse,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • C++ 内存分区模型的使用(代码区、全局区、栈区、堆区、new)

    C++ 内存分区模型的使用(代码区、全局区、栈区、堆区、new)

    这篇文章主要介绍了C++ 内存分区模型的使用(代码区、全局区、栈区、堆区、new),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 通俗易懂讲解C语言与Java中二叉树的三种非递归遍历方式

    通俗易懂讲解C语言与Java中二叉树的三种非递归遍历方式

    二叉树是一种非常重要的数据结构,很多的数据结构都是基于二叉树的基础演变过来的。二叉树的前,中,后3种遍历方式,因为树的定义本身就是递归定义的,所以采用递归的方法来实现是很简单的
    2021-09-09
  • 解决pip install dlib报错C++11 is required to use dlib

    解决pip install dlib报错C++11 is required to use dlib

    这篇文章主要介绍了在使用pip install dlib安装dlib的时候报错C++11 is required to use dlib的解决方法,需要的的小伙伴可以参考一下,希望对你有所帮助
    2022-02-02
  • C++实现扫雷游戏(控制台不闪屏版)

    C++实现扫雷游戏(控制台不闪屏版)

    这篇文章主要为大家详细介绍了C++实现扫雷游戏,控制台不闪屏版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C++中利用cout和fstream采用非科学计数法输出

    C++中利用cout和fstream采用非科学计数法输出

    这篇文章主要介绍了C++中利用cout和fstream采用非科学计数法输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言实现扫雷游戏详细代码

    C语言实现扫雷游戏详细代码

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏的具体步骤和详细代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C++中内存池和内存分配区Arena概念详解

    C++中内存池和内存分配区Arena概念详解

    在 C++ 中,内存分配区(Arena)通常指的是预先分配的一大块连续内存空间,这种方法的主要目的是提高内存分配和释放的效率,下面就跟随小编一起了解一下C++中内存池和内存分配区Arena相关概念吧
    2023-12-12

最新评论