C++static总结

静态局部变量

在函数内部使用 static 关键字修饰的局部变量叫做静态局部变量。
初始化时间:
在函数第一次被调用的时候进行初始化。
静态局部变量的生存期从其初始化开始,一直延续到程序的终止。与自动局部变量(非静态局部变量)不同,静态局部变量在函数调用结束后并不会被销毁。
静态局部变量仅在第一次执行到其声明的代码行时进行初始化,并且只进行一次初始化。之后,即使函数退出,该变量的值仍然保持不变,直到程序结束。

静态全局变量

态全局变量在程序启动时进行初始化,并一直存在于整个程序执行期间。它们占用静态存储区域,并在程序终止时才被销毁。

静态局部变量在函数第一次执行到其声明的代码行时进行初始化,并且只进行一次初始化。它们的生存期与静态全局变量类似,在整个程序执行期间持续存在,直到程序终止时才被销毁。

无论是静态局部变量还是静态全局变量,生命周期都是在进行初始化之后,直到整个程序终止才被销毁。

静态变量默认初始化为零(对于基本数据类型)。

静态成员变量

静态成员变量:在类中声明的静态成员变量,属于类的一部分,而不是对象的一部分。它们在类外部进行定义和初始化,并且只初始化一次。静态成员变量在整个程序执行期间存在,无论是否创建了类的实例或对象。
初始化的时机与静态全局变量相同。

静态成员函数

类内部使用 static 关键字修饰的函数是静态函数。 静态函数属于类而不是类的实例,可以通过类名直接调用,而无需创建对象。 静态函数不能直接访问非静态成员变量或非静态成员函数。

静态常量

在编译时期进行初始化,并且在整个程序执行期间保持不变。
当涉及静态常量时,有两种常见的情况:类内的静态常量和全局的静态常量。下面是它们的示例:

  1. 类内的静态常量:
class MyClass {
public:
    static const int MAX_VALUE = 100; // 类内的静态常量声明和定义
};

// 类外部可以直接使用类名加作用域解析运算符来访问静态常量
int main() {
    int value = MyClass::MAX_VALUE;
    // ...
    return 0;
}

在这个示例中,MyClass 类内部声明和定义了一个静态常量 MAX_VALUE。这个常量可以通过类名加作用域解析运算符 :: 在类外部进行访问和使用。

  1. 全局的静态常量:
static const double PI = 3.14159; // 全局的静态常量声明和定义

int main() {
    double radius = 5.0;
    double circumference = 2 * PI * radius; // 在全局范围内访问全局静态常量
    // ...
    return 0;
}

在这个示例中,全局范围内声明和定义了一个静态常量 PI。这个常量可以在程序的任何地方进行访问和使用。

无论是类内的静态常量还是全局的静态常量,它们在编译时期进行初始化,并且在整个程序执行期间保持不变。它们的值在编译时确定,并且无法在运行时修改。

静态断言

静态断言:静态断言是在编译时期进行的断言检查,用于在编译阶段验证一些常量表达式或类型特性是否满足特定条件。如果断言条件不满足,编译过程将失败并显示错误消息。

static_assert(sizeof(int) == 4, "Size of int must be 4 bytes");

静态对象

静态对象是在程序启动时期创建,并在整个程序执行期间持续存在的对象。静态对象的生存期与程序的生存期相同,它们在程序启动时进行构造,并在程序结束时进行析构。
单例模式:下面是懒汉模式。还存在饿汉模式,就是做成静态成员变量。等待被调用。

class MySingleton {
public:
    static MySingleton& getInstance() {
        static MySingleton instance;
        return instance;
    }
    
private:
    MySingleton() {
        // 构造函数私有化,确保只能通过 getInstance() 获取实例
    }
    
    // 其他成员和函数...
};

静态模板成员

在类模板中,可以声明静态模板成员,它们与类的特定实例无关,可以在模板的不同实例之间共享。

template<typename T>
class MyTemplateClass {
public:
    template<typename U>
    static U add(U a, U b) {
        return a + b;
    }
};
  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在C++中,static关键字主要用于限定对象所使用的内存区域。根据static所应用对象的不同,可以分为全局对象、本地静态对象和类静态成员。在全局变量中使用static关键字,可以将变量存储在静态存储区,使得在函数调用完成后不会释放变量。相比之下,如果没有static修饰符,变量在函数重新被调用时会被再次初始化。\[2\]举个例子,假设有以下代码: ```cpp #include <iostream> using namespace std; int foo1(void){ static int i = 10; return i++; } int foo2(void){ int j = 10; return j++; } int main(void){ cout << "第一次 foo1()=" << foo1() << endl; cout << "第一次 foo2()=" << foo2() << endl; cout << "第二次 foo1()=" << foo1() << endl; cout << "第二次 foo2()=" << foo2() << endl; return 0; } ``` 在这个例子中,foo1()函数中的变量i被声明为静态变量,所以每次调用foo1()函数时,i的值会递增。而foo2()函数中的变量j没有被声明为静态变量,所以每次调用foo2()函数时,j的值都会重新初始化为10。\[3\]这就是C++static关键字的用法。 #### 引用[.reference_title] - *1* *3* [C++ 语法篇之 static 用法](https://blog.csdn.net/yixiwuha/article/details/123145702)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++ static用法总结](https://blog.csdn.net/kupe87826/article/details/121310136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值