C++中的static修饰类的成员变量和成员函数

文章详细阐述了C语言中static关键字的用途,包括延长局部变量的生命周期,改变全局变量和函数的链接属性,以及在类中的静态成员变量和函数的特性和访问方式。静态成员不属于特定对象,而属于整个类,其初始化需在类外完成,且可通过类名直接访问。静态成员函数无法访问非静态成员,因为它们没有隐含的this指针。

回顾一下C语言中static的描述,我们知道:

  1. 当static修饰局部变量时,使局部变量的生命周期延长
  2. .static修饰全局变量时,将外部链接属性变成了内部链接属性,使全局变量的作用域只能在该源文件中执行
  3. .static修饰函数时,将外部链接属性变成了内部链接属性,使函数的作用域只能在该源文件中执行

 概念

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。

类中的成员被static修饰过之后,该成员并不是属于某个对象,而是属于整个类(因为该静态成员存在静态区)。

我们之前了解过的一样,就像类中的成员函数并不是和成员变量一起存在类创建的对象中的,而是存在公共的代码区里。即每个对象在创建的时候都不用为成员函数单独开辟空间,只需要为非静态成员变量开辟空间。

static修饰成员变量

private:
	static int n;//属于整个类里的静态成员,不属于某个对象中
	static int m;//声明

这里static修饰的成员变量是不能给初始值的,因为我们知道这里给值的话,在创建对象时,就会走初始化列表进行初始化,如果初始化列表没有给对应成员变量初始值的话,而这里成员变量声明时恰恰还给了缺省值的话,程序执行的时候自然就会走到这里,用缺省值进行初始化。但是你是用static修饰的静态成员变量的话,目的不就是为了该静态变量不会受到类创建时的影响吗,所以就引出:静态成员变量必须在类外定义,定义时不添加static关键字,类中只是进行声明而已,而且定义的时候不用再加static修饰,表明所在类域就行。

{
private:
	static int n;//属于整个类里的静态成员,不属于某个对象中
	static int m;//声明
};
int A::m = 0;//定义
int A::n = 0;

private修饰的是变量的作用范围,表示只能在本类中使用。 static修饰的是变量的生命周期,它在类加载时一起被加载(在对象生成之前生成),而其他成员变量是在实例化对象时加载的,比其他成员变量要早。


成员访问

那么静态成员变量该怎么访问呢???

我们知道一般成员变量都是设为私有的封装起来,所以成员外的对象是不能进行访问私有成员的,所以我们可以首先想到“解锁”:类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问

我们一般的成员可以通过 对象.成员进行访问,而静态成员会多出一种访问方式:类名::静态成员,因为前面我们已经知道,静态成员并不是属于某个对象里的私有成员,而是属于整个类里面的,所以我们可以直接通过类名进行访问。

那么还有没有其他方法呢???

另外一种就是在类里再创建一个成员函数,通过访问成员函数去访问类里的成员。

class A
{
public:
	A()
	{
		++m;
		++n;
	}
	void Print()
	{
		cout << m << " " << n << endl;
	}

private:
	static int n;//属于整个类里的静态成员,不属于某个对象中
	static int m;//声明
};
int A::m = 0;//定义
int A::n = 0;

int main()
{
	A a2;
	a2.Print();

}

static修饰成员函数

static也是可以修饰函数的,就像上面访问成员其实还有一种方式,可以不创建对象,直接通过类访问:

class A
{
public:
	A()
	{
		++m;
		++n;
	}
	static void Print()//静态成员函数(没有this指针)所以不能访问非静态成员
	{
		cout << m << " " << n << endl;
	}

private:
	static int n;//属于整个类里的静态成员,不属于某个对象中
	static int m;//声明
};
int A::m = 0;//定义
int A::n = 0;

int main()
{
	A::Print();

}

同理可以了解到,static修饰的成员函数也是属于整个类里面的,所以可以直接通过类名去访问成员函数的。所以同时就引出:静态成员函数没有隐藏的this指针,不能访问任何非静态成员.static函数唯一能够访问的就是static变量或者其他static函数

这是因为你在调用静态成员函数的时候,实际上是通过类名调用的(即使你用对象调用),所以传参的时候就不会隐式的传对象的指针,所以就没有this指针变量,因此就不可以在函数内访问类里的非静态成员。

最后一点就是:静态成员也是类的成员,受public、protected、private 访问限定符的限制
 

12f9789a1f6244ac97e836a9f7b49365.gif

### C++ 中 `static` 关键字对变量的作用 #### 局部变量 在函数体内声明的 `static` 变量具有记忆功能。这意味着即使函数返回后再次调用该函数,其值仍然保持不变。静态变量只初始化一次,并且它们的生命周期延长至程序结束。这种变量存储在静态数据区[^1]。 例如: ```cpp void fun1() { static int staticVar = 1; int var = 1; std::cout << "staticVar: " << ++staticVar << ", var: " << ++var << std::endl; } ``` 在第一次调用 `fun1()` 时,`staticVar` 初始化为 1。在第二次调用 `fun1()` 时,`staticVar` 的值会保留为 2,而 `var` 每次都会重新初始化为 1[^4]。 #### 全局变量 普通全局变量在整个工程中都是可见的,其他文件可以通过 `extern` 声明来访问这些变量。然而,静态全局变量仅在当前文件中可见,其他文件无法访问。这有助于避免命名冲突并提高封装性。 ### C++ 中 `static` 关键字对函数的作用 #### 中的静态成员函数中声明的 `static` 成员函数不能访问非静态成员变量或非静态成员函数。这是因为静态成员函数没有 `this` 指针,因此它们只能访问的静态成员变量其他静态成员函数。静态成员函数通常用于操作静态成员变量或执行与相关的任务,而不需要特定对象实例[^2]。 例如: ```cpp class MyClass { private: static int count; public: MyClass() { ++count; } static int getCount() { return count; } }; int MyClass::count = 0; // 初始化静态成员变量 ``` 在这个例子中,`getCount()` 是一个静态成员函数,它返回静态成员变量 `count` 的值。这个函数可以在没有 `MyClass` 实例的情况下调用。 ### 存储区域初始化 普通局部变量存储在栈区,进入作用域时创建,退出作用域时销毁。而 `static` 修饰的局部变量存储在静态数据区,其生命周期延长至程序结束。此外,静态变量全局变量在静态数据区默认初始化为 0,这减少了手动初始化的工作量[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CR0712

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值