整理复习第二讲——static

static的总结相比之前的const会简单不少,内容分支不是很多,希望大家可以细心看到最后,一定会有所收获的!

静态变量

函数中的静态变量

#include <iostream>

using namespace std;

int stnum = 0;
void func1()
{
	static int num1 = 0;
	cout << num1 << " ";
	num1++;
}
int main()
{
	for (int i = 0; i < 10; ++i)
	{
		func1();
	}
	cout << endl;
	for (int i = 0; i < 10; ++i)
	{
		++stnum;
		cout << stnum << " ";
	}
	return 0;
}

 在学习C语言的时候我们就学过了static修饰变量可以将变量开辟在常量区,开辟在常量区之后的变量,首先改变的是生命周期(这个之后再说),其次这个变量在第一次被初始化之后,后期对值所做的修改变量也会改变,不会因为出函数作用域而被销毁(这也和变量生命周期被改变有关)。

在上面的代码中,大家一定要注意一个问题,stnum是在函数外创建的变量,没有static修饰但也是一个创建在常量区的变量,而static修饰的变量num1也是在常量区的一个变量,不同之处在于前者的作用域是全局,后者的作用域是func1函数内部,所以即使是static修饰的变量,虽然创建在了常量区,但是使用的时候一定注意作用域!

类中的静态变量

类中的静态变量是属于类而不属于类对象,这一定也很好理解,静态变量只能被初始化一次,但是类对象中的成员变量对于每个对象来说都是独立的,所以对于不同的对象,不能有相同静态变量 的多个副本。因为这个原因,静态变量不能使用构造函数初始化。

#include <iostream>
using namespace std;

class test
{
public:
	static int _i;
	test()
	{}
};
int test::_i = 10; 
int main()
{
	test t1;
	t1._i = 1;
	test t2;
	t2._i = 2;
	cout << t1._i << " " << t2._i << endl;
	return 0;
}

上面代码中,在类外定义了类中的静态变量_i,之后再main函数中对其进行修改,最终的打印结果为  2 2 ,所以就可以发现,静态变量可以通过对象进行修改,但是最后一次被修改的值为最终值。

总结一下:

  • 类中的静态变量只能再类外被初始化,不能再任何函数内初始化,初始化格式如上代码所示
  • 类中的静态变量可以理解为属于类的一个成员变量,之后通过对象对其进行的修改,最后一次修改的值为静态变量的最终值

静态成员

类对象为静态

这里要说的就是上面提到的生命周期,就像变量一样,对象也在声明为static时具有范围,直到程序的生命周期。

#include<iostream> 
using namespace std; 

class Apple 
{ 
	int i; 
	public: 
		Apple() 
		{ 
			i = 0; 
			cout << "Inside Constructor\n"; 
		} 
		~Apple() 
		{ 
			cout << "Inside Destructor\n"; 
		} 
}; 

int main() 
{ 
	Apple obj;  
	cout << "End of main\n"; 
} 

输出:

Inside Constructor
Inside Destructor
End of main

在上面的代码中,obj是普通对象,来看它的构造和析构的顺序,和我们想象中一样,在执行cout之前对象就已经被回收掉了。最后打印最后一句End of main

#include<iostream> 
using namespace std; 

class Apple 
{ 
	int i; 
	public: 
		Apple() 
		{ 
			i = 0; 
			cout << "Inside Constructor\n"; 
		} 
		~Apple() 
		{ 
			cout << "Inside Destructor\n"; 
		} 
}; 

int main() 
{ 
	static Apple obj; 
	cout << "End of main\n"; 
} 

输出:

Inside Constructor
End of main
Inside Destructor

这份代码就很清楚的看到了,被const修饰后的obj对象,生命周期为整个程序,程序结束,static对象被回收,调用对应的析构函数。

类中的静态函数

很类中的静态变量相似,静态成员函数不属于任意一个类对象,而是属于这个类,最明显的就是类中的静态函数是没有this指针,所以静态函数是不可以访问除静态变量的其他成员变量的。

class test
{
private:
	int _a;
public:
	static int _i;
	test(int num = 0)
		:_a(num)
	{}
	static void Print()
	{
		cout << _i;
	}
};
int test::_i = 10; 
int main()
{
	test t1(11);
	t1.Print();
	return 0;
}

结果是可以打印出10的,为什么不可以访问其他非静态成员变量也是可以理解的,因为其他非静态成员变量是属于对象的,没有this指针,就不知道要访问哪个对象的成员变量。

内容不多,但是还是有很多细节值得理解,谢谢大家支持,希望大家学习愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Feng,

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

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

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

打赏作者

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

抵扣说明:

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

余额充值