类和对象——再谈static成员(c++中的static成员)

一、c++中的static成员

1.概念

static的修饰会让一个变量或者函数拥有“记忆”功能,即便是在循环中的初始化也只会初始化一次,之后在全局中的任何地方进行调用,值都是保持上一次修改之后的。静态成员是被放在静态区,而不是在栈区。
static成员有三种:用static修饰的类,被称为类的静态成员。用static声明的变量,被称为静态成员变量。用static声明的函数,被称为静态成员函数。

2.理解实例

为了更好的理解在c++中的全局变量,我们一起来看下面这段代码

class A
{
public:
	A()
	{++_count;}
	A(const A& a)
	{++_count;}
	~A()
	{}
	static int getcount()
	{return _count;}
private:
static int _count;
}
int A::_count=0;
int main()
{
	cout<<A::getcount()<<endl;
	A a1,a2;
	A a3(a1);
	cout<<A::getcount()<<endl;
	return 0;
}

首先我们通过这段代码,我们可以看出来一些static成员的一些使用格式,首先我们发现,静态成员变量的声明是在类内,但是定义是在类外。 但是,静态成员函数的声明和定义都在类内,和普通的成员函数并没有太大的区别。
然后我们再来看这段代码的含义,这段代码是用来计算A类型的类到底创建了多少次。 类的static成员其实就是相当于这个类共用的一个变量或者函数,只是并不会在每次创建新对象时,去重新初始化而已。
这段代码就是使用_count来计算创建变量的次数,_count在类外定义为0,然后在对a1进行初始化的时候,_count就会+1,然后在对a2进行初始化的时候,也是会去调用构造函数,构造函数中会去调用_count这个静态成员变量,然后对其进行+1。这里的_count不会再重新被定义为0,进而才能留存下来类的创建的次数。 原因也很简单,是因为静态成员变量的地址就不在类的内部。
此外我们可以注意到,静态成员函数是可以直接调用静态成员变量的

3.注意事项

  1. 静态成员是属于整个类的,并不是属于某一个对象,存放于静态区。
  2. 静态成员变量必须在类外定义,并且定义时不用加static,static只是在声明时出现即可,静态成员函数可以直接在类内定义。
  3. 访问类的静态成员时,要使用类::静态成员或者对象.静态成员,这两者的地址是相同的,也就是说所有对象的静态成员使用的都是整个类共用的。
  4. 静态成员函数不会自动带this指针,也就不能访问任何非静态私有成员变量,静态的私有成员变量是可以访问的。
  5. 静态成员也是类的成员,也受public、private、protected访问限制符的限制。

4.思考

我们结合上面的注意事项,来思考两个问题。

  1. 静态成员函数可以调用非静态成员函数吗?
  2. 非静态成员函数可以调用类的静态成员函数吗?

首先答案是不可以和可以,我们来看看到底是怎么回事。
第一个问题,我们知道,静态成员函数是没有this指针的,所以在静态函数中,不存在this指针,如果在函数中引用了非静态成员函数,那么非静态函数会默认拥有了this指针,进而去调用一些非静态成员,这时候系统就会报错。
第二个问题,我们知道静态成员函数中不存在调用非静态的成员,所以在非静态成员函数中调用静态成员函数,无非就是静态成员函数不用非静态成员。

二、多个文件的情况

在之前的学习我们知道,static的作用域只存在于当下文件,当我们跨文件去使用静态变量时,就会有报错出现。
这时候我们就需要把静态成员函数转变为普通成员函数。

创作不易,感谢阅读。

  • 34
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值