C++ static详解

本文详细介绍了静态变量和静态函数的概念及其使用方法。包括全局静态变量、局部静态变量的特点及应用场景,静态函数的作用范围,以及静态成员变量和静态成员函数的特性与访问方式。

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

一 静态变量

1 全局静态变量

全局静态变量不具有链接性。在本文件中一直是可见的,但是在工程中其他文件中是不可见的。

#include <iostream>
using namespace std;
void fn();
static int n;
//静态全局变量在本文件中一直可见,但是在工程中的其他文件中是不可见的。
int main()
{
n=20;
cout<<n<<endl;
fn();
return 0;

}
void fn()
{
using namespace std;
n++;
cout<<n<<endl;

}

2 全局变量

全局变量具有外部连接性。在整个工程中所有的文件都是可见的。

3 局部变量

在定义它的函数内部有效,但是函数返回后失效。

4 静态局部变量

静态局部变量只在定义它的函数内部有效,但是程序仅分配一次内存,函数返回时该变量不会消失。

#include <iostream>
void fn();
int main()
{
fn();
fn();
fn();
return 0;

// 程序运行结果为:11,12,13

}
void fn()
{

static int n=10;
n++;
std::cout<<n<<std::endl;

}

二 静态函数

静态函数只在声明的文件中可见。不能被其他文件使用。在其他文件中可以定义相同的函数名。

三 静态成员变量

静态成员函数是不能在类体中进行赋值的,因为它是被所有该类对象所共有的。你在一个对象中对它进行赋值,相应的其他对象也会发生改变。所以只能在类体外进行赋值。类的静态数据成员有两种访问方式。类的静态成员变量的优点:1 静态成员变量的名字在类的作用域中,因此可以避免冲突。2 静态成员变量可以实现封装,可以是私有成员,但是,全局对象不可以。3 静态成员函数与特定类关联,结构清晰。

四 静态成员函数

静态成员函数和非静态成员函数的根本区别:静态成员函数没有this指针。非静态成员函数有this指针。因此,静态成员函数不能访问类中的非静态成员变量。静态成员函数的作用就是为了访问静态数据成员。
静态成员函数不能被声明为const。静态成员函数也不能被声明为虚函数。
注意事项:
   1)出现在类体外的函数不能指定关键字static;

(2)静态成员之间可以互相访问,包括静态成员函数访问静态数据成员和访问静态成员函数;

(3)非静态成员函数可以任意地访问静态成员函数和静态数据成员;

(4)静态成员函数不能访问非静态成员函数和非静态数据成员;

(5)由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比,速度上会有少许的增长;

(6)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指调用静态成员函数。

#include <iostream>
using namespace std;
class Myclass{
public:
Myclass(int a, int b, int c);
static void fun(); //静态成员函数
private:
int a,b,c;
static int sum;//声明静态数据成员
};

int Myclass::sum = 0; //在类体外对静态成员变量初始化

Myclass::Myclass(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
sum += a+b+c;
}

void Myclass::fun()
{
cout<<"sum = "<<sum<<endl;
}




int main()
{
Myclass M(1,2,3);
M.fun();

Myclass N(4,5,6);
N.fun();
Myclass::fun();//静态成员函数的访问
return 0;
}




<think>好的,我现在需要详细解释C++中的static关键字,涵盖静态变量、静态方法和静态成员。用户已经提供了一些引用内容,我需要结合这些内容,同时确保回答结构清晰,符合用户的要求。首先,我应该按照类外和类内来分大类,然后每个部分再细分变量和函数。 首先,类外的static,也就是静态全局变量和静态函数。静态全局变量的作用域仅限于当前文件,这可以避免命名冲突。而静态函数也是只能在当前文件内访问,起到封装的作用。这部分需要举例说明,比如在多个文件中使用同名变量时,static可以避免重复定义的错误。 接下来是类内的static,分为静态成员变量和静态成员函数。静态成员变量属于类本身,所有对象共享同一份内存,必须在类外初始化。比如引用[1]和引用[2]提到的count变量,可以用来统计对象数量。静态成员函数则只能访问静态成员,不能访问非静态成员,因为它们没有this指针。例如,printCount方法可以直接通过类名调用,而不需要对象实例。 还要注意静态局部变量,在函数内部声明,生命周期持续到程序结束,但作用域仅限于函数内部。这常用于保持函数调用之间的状态,比如统计函数被调用的次数。 需要检查是否有遗漏的部分,比如静态成员变量的初始化必须在类外进行,这一点很重要,用户可能会遇到链接错误,如果忘记初始化的话。另外,静态成员函数不能声明为const,因为它们不操作具体对象。 用户可能的问题包括:static在类内外的区别,静态成员初始化的方法,静态函数为什么不能访问非静态成员,以及使用场景比如单例模式、工具类函数等。需要确保这些问题在回答中有所覆盖,或者在相关问题里提出。 最后,按照用户要求,生成相关问题,帮助用户进一步学习。需要确保LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,并正确引用提供的参考资料。同时,回答要使用中文,结构清晰,分点说明,代码示例正确。</think>### C++中`static`关键字详解 `static`关键字在C++中根据作用域分为 **类/结构体外** 和 **类/结构体内** 两类,具体用法如下: --- #### 一、类或结构体外的`static` 1. **静态全局变量** - **特点**:作用域仅限于当前文件,避免与其他文件同名变量冲突。 - **示例**: ```cpp // file1.cpp static int globalVar = 10; // 仅在此文件内可见 // file2.cpp extern int globalVar; // 无法访问file1的globalVar ``` 2. **静态函数** - **特点**:只能在当前文件内调用,实现代码隐藏。 - **示例**: ```cpp static void helper() { // 仅当前文件可用 // 工具逻辑 } ``` --- #### 二、类或结构体内的`static` 1. **静态成员变量** - **特点**: - 属于类本身,所有对象共享同一份内存。 - 必须**在类外初始化**(需单独分配内存)。 - **示例**: ```cpp class MyClass { public: static int count; // 声明静态变量 }; int MyClass::count = 0; // 类外初始化 ``` - **应用场景**: - 统计对象数量(如引用[^1]中的示例)。 - 共享配置参数(如缓存大小)。 2. **静态成员函数** - **特点**: - 通过类名直接调用,无需对象实例(如`MyClass::printCount()`)。 - **只能访问静态成员**(无`this`指针,无法操作非静态成员)。 - **示例**(引用[^2]): ```cpp class MyClass { public: static void printCount() { std::cout << "Count: " << count << std::endl; // 仅访问静态变量 } }; ``` 3. **静态局部变量** - **特点**: - 生命周期持续到程序结束,但作用域限于函数内。 - 首次调用时初始化,后续调用保留值。 - **示例**: ```cpp void func() { static int callCount = 0; // 函数调用间保持状态 callCount++; } ``` --- #### 三、关键区别总结 | 类型 | 作用域/生命周期 | 访问方式 | |-----------------|------------------------------|------------------------| | 静态全局变量 | 文件内可见 | 文件内直接使用 | | 静态成员变量 | 类共享,程序生命周期 | 类名::变量名 | | 静态成员函数 | 类共享,无对象依赖 | 类名::函数名() | | 静态局部变量 | 函数内作用域,程序生命周期 | 函数内直接使用 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值