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信号与槽的各种连接方式

    浅谈Qt信号与槽的各种连接方式

    信号和槽是Qt特有的信息传输机制,本文主要介绍了浅谈Qt信号与槽的各种连接方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C++函数模板与类模板相同与不同介绍

    C++函数模板与类模板相同与不同介绍

    C++语言的模板技术包括函数模板和类模板,模板技术是一种代码重用技术,函数和类是C++语言中两种主要的重用代码形式,这篇文章主要介绍了C++函数模板和类模板,需要的朋友可以参考下
    2022-08-08
  • C++中 静态局部变量实例详解

    C++中 静态局部变量实例详解

    这篇文章主要介绍了C++中 静态局部变量实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • C语言怎么获得进程的PE文件信息

    C语言怎么获得进程的PE文件信息

    这篇文章主要介绍了C语言怎么获得进程的PE文件信息的相关代码,需要的朋友可以参考下
    2016-01-01
  • C++实现随机生成迷宫地牢

    C++实现随机生成迷宫地牢

    这篇文章主要介绍了C++实现随机生成迷宫地牢的相关资料及代码分享,推荐给大家,有需要的小伙伴可以参考下。
    2015-03-03
  • 如何写好C main函数的几个注意事项

    如何写好C main函数的几个注意事项

    这篇文章主要介绍了如何写好C main函数的几个注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Qt QChart 创建图表的实现方法

    Qt QChart 创建图表的实现方法

    这篇文章主要介绍了Qt QChart 创建图表的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • CrashRpt使用案例详解

    CrashRpt使用案例详解

    这篇文章主要介绍了CrashRpt使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • win10中的dlib库安装过程

    win10中的dlib库安装过程

    这篇文章主要介绍了win10中dlib库的安装过程,本文通过实例图文介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • c++深入浅出讲解堆排序和堆

    c++深入浅出讲解堆排序和堆

    在c++里有很多排序方法,比如相对简单的冒泡排序、选择排序、插入排序,还有 STL里的sort函数  手写快排  归并排序等,还有就是堆排序,这次主要说堆排序和堆
    2022-03-03

最新评论