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++实现中缀转后缀的问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • C++实现简单计算器功能

    C++实现简单计算器功能

    这篇文章主要为大家详细介绍了C++实现简单计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C语言图文并茂详解链接过程

    C语言图文并茂详解链接过程

    首先来思考一个问题:工程中的每个C语言源文件被编译后生成的目标文件,这些目标文件如何生成最终的可执行程序? 这就需要这节我们将要分析的链接器
    2022-04-04
  • VS2010/MFC编程(常用控件:树形控件Tree Control控件创建h和实例)

    VS2010/MFC编程(常用控件:树形控件Tree Control控件创建h和实例)

    本篇文章介绍了VS2010/MFC编程:常用控件:树形控件Tree Control,包括树形控件的创建、CTreeCtrl类的主要成员函数和应用实例有兴趣的可以了解一下。
    2016-12-12
  • C语言柔性数组的实现示例

    C语言柔性数组的实现示例

    柔性数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,本文就来介绍一下柔性数组的用法,感兴趣的可以了解一下
    2024-03-03
  • C++递归删除一个目录实例

    C++递归删除一个目录实例

    这篇文章主要介绍了C++递归删除一个目录的实现方法,涉及到目录的操作及递归算法的应用,需要的朋友可以参考下
    2014-10-10
  • ShellExecute函数用法的实例代码

    ShellExecute函数用法的实例代码

    ShellExecute函数用法的实例代码,需要的朋友可以参考一下
    2013-03-03
  • 基于QT5的文件读取程序的实现

    基于QT5的文件读取程序的实现

    本文主要介绍了基于QT5的文件读取程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C++函数指针详解

    C++函数指针详解

    这篇文章主要介绍了C++函数指针详解,通过文字描述C++函数指针基础概念,内涵详细的代码实现和解析,希望对你能够有所帮助
    2021-06-06
  • 详解C语言中动态内存管理

    详解C语言中动态内存管理

    这篇文章主要为大家详细介绍了C语言中动态内存管理的相关知识,以及常见的动态内存的错误,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-07-07

最新评论