【C++面试】static

本文主要解析了static关键字的作用。它可使全局变量和函数对源文件隐藏;能保持变量内容持久,如函数内的static变量生命周期为整个程序;默认初始化为0;还可用于类成员声明。文中通过代码示例展示了static变量的持久特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对这个关键字总是模模糊糊。

作用

1.隐藏

同时编译多个文件时,未加static关键字的全局变量和函数具有全局可见性(但使用其他文件的全局变量或者函数时需要加上extern关键字),所以static修饰过的全局变量和函数会对源文件隐藏。

2.保持变量内容的持久

存储在静态数据区的变量(全局变量和static变量)在程序开始时就会初始化

(在函数内部定义的static变量的生命周期是整个程序,但是作用域是局部的)

#include <stdio.h>
 
int fun(){
    static int count = 10; //在第一次进入这个函数的时候,变量a被初始化为10!并接着自减1,以后每次进入该函数,a
    return count--; //就不会被再次初始化了,仅进行自减1的操作;在static发明前,要达到同样的功能,则只能使用全局量:   
}
 
int count = 1;
 
int main(void)
{
     printf("global\t\tlocal static\n");
     for(; count <= 10; ++count)
               printf("%d\t\t%d\n", count, fun());
     return 0;
}

这个例子中fun()函数中重新将全局变量count改成static变量,第一次调用fun时进行了初始化,在以后调用过程不会再次初始化

global  local static

1 10

2 9

3 8

4 7

5 6

6 5

7 4

8 3

9 2

10 1

3.默认初始化为0

4.类成员声明static

 

<think>我们正在讨论C++中的static关键字。根据引用内容,staticC++中用于修饰变量函数和类成员,主要作用是控制存储方式和作用范围。下面我将详细解释static的几种用法。 1. **静态局部变量**:在函数内部使用static修饰的局部变量。这种变量在程序运行期间只初始化一次,且生命周期持续到程序结束。每次函数调用时,该变量保持上次调用结束时的值。例如: ```cpp void func() { static int count = 0; // 只初始化一次 count++; cout << count << endl; } ``` 调用`func()`三次会输出1, 2, 3。因为`count`在函数调用之间保持其值。 2. **静态全局变量/函数**:在全局作用域(函数外部)使用static修饰的变量函数,其作用域仅限于定义它的文件(编译单元)。这样避免了命名冲突,也实现了信息隐藏。例如: ```cpp // file1.cpp static int globalVar = 42; // 只在file1.cpp中可见 // file2.cpp extern int globalVar; // 错误!无法访问file1.cpp中的globalVar ``` 3. **静态成员变量**:在类内部static修饰的成员变量。它属于整个类,而不是某个对象,因此被所有对象共享。必须在类外定义和初始化(除非是C++17引入的inline static)。例如: ```cpp class MyClass { public: static int count; // 声明 }; int MyClass::count = 0; // 定义和初始化 // 使用:MyClass::count 或 obj.count(不推荐通过对象访问) ``` 4. **静态成员函数**:用static修饰的成员函数。它属于类而不是对象,因此不能访问非静态成员(因为没有this指针)。可以通过类名直接调用。例如: ```cpp class MyClass { public: static void printCount() { cout << count << endl; // 正确,count是静态成员变量 // cout << data; // 错误!不能访问非静态成员 } private: int data; static int count; }; ``` 总结static关键字的作用: - 延长局部变量的生命周期(使其具有静态存储期) - 限制全局变量/函数的作用域(文件作用域) - 实现类的成员变量函数由所有对象共享 这些特性使得static在模块化设计、数据共享和状态保持等场景中非常有用。 §§相关问题§§ 1. 静态成员变量在类中如何初始化? 2. 为什么静态成员函数不能访问非静态成员变量? 3. 静态局部变量和全局静态变量有什么区别? 4. 在多线程环境下使用static变量需要注意什么?</think>### C++中`static`关键字的作用详解 `static`关键字在C++中有多种用法,主要控制变量函数的**存储方式**和**作用范围**。以下是核心作用: --- #### 1. **静态局部变量** 在函数内部声明,生命周期延长至程序结束,且**只初始化一次**: ```cpp void counter() { static int count = 0; // 只初始化一次 count++; std::cout << count << "\n"; } // 调用 counter() 三次输出:1, 2, 3 ``` - **特点**:函数退出后值仍保留,下次调用时沿用上次的值[^3]。 --- #### 2. **静态全局变量/函数** 在全局作用域使用`static`,限制作用域为**当前文件**: ```cpp // file1.cpp static int globalVar = 100; // 仅file1.cpp可见 static void helper() { ... } // 仅file1.cpp可调用 ``` - **作用**:避免多文件编译时的命名冲突,实现模块化封装[^1][^3]。 --- #### 3. **静态成员变量** 在类中声明,被**所有对象共享**: ```cpp class MyClass { public: static int sharedCount; // 声明 }; int MyClass::sharedCount = 0; // 类外定义初始化 ``` - **特点**: - 不属于任何对象,通过`类名::变量名`访问(如`MyClass::sharedCount`)。 - 替代全局变量,避免命名污染[^2]。 --- #### 4. **静态成员函数** 属于类而非对象,**无`this`指针**: ```cpp class MyClass { public: static void printCount() { std::cout << sharedCount; // 只能访问静态成员 } }; // 调用:MyClass::printCount(); ``` - **限制**: - 不能访问非静态成员(因无对象实例)[^2][^3]。 --- ### 总结对比 | 类型 | 作用域 | 生命周期 | 关键特性 | |---------------------|----------------------------|----------------|------------------------------| | 静态局部变量 | 函数内部 | 程序结束 | 只初始化一次,保留状态 | | 静态全局变量/函数 | 当前文件 | 程序结束 | 避免跨文件命名冲突 | | 静态成员变量 | 类作用域 | 程序结束 | 所有对象共享,类外初始化 | | 静态成员函数 | 类作用域 | - | 无`this`指针,仅访问静态成员 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值