当前位置: 首页 > news >正文

C++11新特性 5.static静态

目录

一.简介

1.基本概念

2.语法

(1)静态局部变量

(2) 静态成员变量

 (3)静态成员函数

二.使用示例

示例1:静态局部变量

示例2:静态成员变量

示例3:静态成员函数

 示例4:在 C++11 新特性中的应用

示例5:静态全局变量和函数


一.简介

1.基本概念

在 C++ 中,static 是一个用途广泛的关键字,它主要用于控制变量和函数的存储方式、生命周期和作用域。static 关键字在不同的上下文中有不同的含义,核心思想是将变量或函数的作用范围限制在特定的区域内,并且在程序的整个生命周期内保持其存在和状态。

在 C++11 中,static 关键字延续了其在 C++ 早期版本中的一些重要特性,同时也在一些新特性的语境下有着特定的应用。

2.语法

(1)静态局部变量

void function() {
    static 数据类型 变量名 = 初始值;
    // ...
}

(2) 静态成员变量

class ClassName {
public:
    static 数据类型 变量名; // 类内声明
    // ...
};
数据类型 ClassName::变量名 = 初始值; // 类外定义和初始化

 (3)静态成员函数

class ClassName {
public:
    static 返回类型 函数名(参数列表);
    // ...
};
返回类型 ClassName::函数名(参数列表) {
    // 函数体
}

 

二.使用示例

示例1:静态局部变量

当 static 用于修饰局部变量时,该变量被称为静态局部变量。静态局部变量在函数第一次调用时初始化,之后每次调用函数时不会再次初始化,而是保留上一次调用结束时的值。

#include <iostream>

void showCount() {
    static int count = 0; // 静态局部变量,仅初始化一次
    std::cout << "Count: " << count << std::endl;
    count++;
}

int main() {
    showCount(); // 输出: Count: 0
    showCount(); // 输出: Count: 1
    return 0;
}

注意事项

静态局部变量的生命周期是整个程序运行期间,但其作用域仍然局限于定义它的函数内部。

示例2:静态成员变量

在类中使用 static 修饰的成员变量称为静态成员变量。静态成员变量属于类本身,而不是类的某个对象,所有对象共享同一个静态成员变量。

#include <iostream>

class MyClass {
public:
    static int staticVar;  // 静态成员变量声明
};

// 静态成员变量定义和初始化
int MyClass::staticVar = 10;

int main() {
    MyClass obj1, obj2;
    std::cout << "obj1.staticVar: " << obj1.staticVar << std::endl;  // 输出: obj1.staticVar: 10
    std::cout << "obj2.staticVar: " << obj2.staticVar << std::endl;  // 输出: obj2.staticVar: 10
    MyClass::staticVar = 20;  // 可以通过类名直接访问和修改静态成员变量
    std::cout << "obj1.staticVar: " << obj1.staticVar << std::endl;  // 输出: obj1.staticVar: 20
    std::cout << "obj2.staticVar: " << obj2.staticVar << std::endl;  // 输出: obj2.staticVar: 20
    return 0;
}

注意事项:

1.静态成员变量必须在类外部进行定义和初始化,除非它是const static类型且为整数类型(如 intchar 等),可以在类内部初始化。

2.可以通过类名或对象名访问静态成员变量。

示例3:静态成员函数

使用 static 修饰的类成员函数称为静态成员函数。静态成员函数同样属于类本身,不依赖于类的具体对象,可以直接通过类名调用。

#include <iostream>

class MyClass {
public:
    static int staticVar;

    static void staticFunc() {
        std::cout << "Static variable value: " << staticVar << std::endl;
    }
};

int MyClass::staticVar = 10;

int main() {
    MyClass::staticFunc();  // 可以直接通过类名调用静态成员函数
    return 0;
}

 注意事项:

1.静态成员函数只能访问静态成员变量和其他静态成员函数,不能访问非静态成员变量和非静态成员函数,因为静态成员函数不与任何具体对象关联,没有 this 指针。

2.静态成员函数可以在不创建对象的情况下调用,这在一些工具类或全局功能封装中非常有用。

示例4:在 C++11 新特性中的应用

在 Lambda 表达式中:虽然 static 本身不是 Lambda 表达式的新特性,但在 Lambda 表达式中可以使用静态局部变量。

#include <iostream>

int main() {
    auto lambda = []() {
        static int count = 0;
        std::cout << "Lambda count: " << count << std::endl;
        count++;
    };

    lambda();  // 输出: Lambda count: 0
    lambda();  // 输出: Lambda count: 1
    return 0;
}

在这个 Lambda 表达式中,static int count 是一个静态局部变量,每次调用 Lambda 表达式时,它会保留上一次的值。 

示例5:静态全局变量和函数

// file1.cpp
#include <iostream>

static int staticGlobalVar = 10; // 静态全局变量

static void staticFunction() { // 静态全局函数
    std::cout << "Static global variable: " << staticGlobalVar << std::endl;
}

// file2.cpp
// 无法访问 file1.cpp 中的 staticGlobalVar 和 staticFunction

int main() {
    staticFunction(); // 输出: Static global variable: 10
    return 0;
}

注意事项:

静态全局变量和函数具有内部链接属性只能在定义它们的文件中被访问,这有助于避免不同文件中同名变量或函数的冲突。不过,在现代 C++ 中,更推荐使用匿名命名空间来实现相同的功能。

相关文章:

  • 【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题
  • MySQL(单表)知识点
  • 蓝耘智算 + 通义万相 2.1:为 AIGC 装上 “智能翅膀”,翱翔创作新天空
  • 代码随想录-训练营-day46
  • ES语法学习
  • neo4j-解决neo4j网页版打不开
  • HPC超算系列3——新手指南2
  • 基于Asp.net的度假村管理系统
  • 【弹性计算】异构计算云服务和 AI 加速器(二):适用场景
  • 快乐数 力扣202
  • Windows下安装kafka
  • WebGL 深度解析:从原理到实践的全方位指南
  • ClusterIP、Headless Service 和 NodePort 的比较
  • 整理了一下网络编程中TCP的状态
  • 小程序 wxml 语法 —— 38 setData() - 修改数组类型数据
  • 如何在vscode里像typora那样插入图片?
  • Django Form 组件
  • K8S学习之基础十八:k8s的灰度发布和金丝雀部署
  • Python使用入门(一)
  • 从0开始的操作系统手搓教程27:下一步,实现我们的用户进程
  • 网站建设上门按摩哪家好/网站网络排名优化方法
  • 如何破解网站后台密码/赣州seo
  • 做百度收录比较好的网站/泉州seo托管
  • 建设银行网站怎么短信转账/百度app官方正式版
  • 南宁网站制作哪家好/互联网营销师证书查询入口
  • wordpress前台美化/长春seo优化企业网络跃升