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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言中基础小问题详细介绍

    C语言中基础小问题详细介绍

    这篇文章详细介绍了C语言中基础小问题,有需要的朋友可以参考一下
    2013-10-10
  • C语言 动态内存开辟常见问题解决与分析流程

    C语言 动态内存开辟常见问题解决与分析流程

    动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存
    2022-03-03
  • C语言程序的编译与预处理基础定义讲解

    C语言程序的编译与预处理基础定义讲解

    在ANSI C的任意一种实现中,存在2中不同的环境。第一种是翻译环境,负责将源代码转换成可执行的机器指令;第二种是执行环境,用于实际执行代码。一个程序从源代码到可执行程序一共会经历四个过程,分别是预处理、编译、汇编、链接,本篇让我们来了解编译与预处理
    2022-04-04
  • C语言三子棋小游戏的实现代码

    C语言三子棋小游戏的实现代码

    这篇文章主要为大家详细介绍了C语言三子棋小游戏的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 在C++中高效使用和处理Json格式数据的示例代码

    在C++中高效使用和处理Json格式数据的示例代码

    最近的项目在用c处理后台的数据时,因为好多外部接口都在使用Json格式作为返回的数据结构和数据描述,如何在c中高效使用和处理Json格式的数据就成为了必须要解决的问题,需要的朋友可以参考下
    2023-11-11
  • C++使用curl库的完成流程

    C++使用curl库的完成流程

    curl 是一个利用URL语法在命令行方式下工作的文件传输工具,curl不但提供了一个可执行的工具库,还提供了供程序开发的libcurl库,该库使用c语言编写,支持跨平台,本文给大家介绍了C++使用curl库的完成流程,需要的朋友可以参考下
    2024-09-09
  • C++ Sqlite3的使用方法

    C++ Sqlite3的使用方法

    这篇文章主要介绍了C++ Sqlite3的使用方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C语言数据结构中串的模式匹配

    C语言数据结构中串的模式匹配

    这篇文章主要介绍了C语言数据结构中串的模式匹配的相关资料,需要的朋友可以参考下
    2017-05-05
  • C++实现希尔排序(ShellSort)

    C++实现希尔排序(ShellSort)

    这篇文章主要为大家详细介绍了C++实现希尔排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C语言数据结构不挂科指南之队列详解

    C语言数据结构不挂科指南之队列详解

    这篇博客主要介绍一下队列的概念,并且采用 C 语言,编写两种存储实现方式:顺序存储和链式存储,当然还有常规的队列基本操作的实现算法
    2022-09-09

最新评论