💖作者:小树苗渴望变成参天大树
❤️🩹作者宣言:认真写好每一篇博客
💨作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++
文章目录
- 前言
前言
今天我们来讲一个static对类的对象的作用和用法,这个关键字在类和对象中有很大的作用,话不多说,我们开始进入正文。
创建一个类,计算在一个程序中创建了多少个类对象:
int _scount = 0;//通过全局变量来计算对象的个数
class A
{
public:
A() { ++_scount; }//默认构造函数
A(const A & t) { ++_scount; }//拷贝构造
~A() { --_scount; }//析构函数
private:
};
A a1;
void fun()
{
A a;
cout <<__LINE__ << ":" << _scount << endl;
}
int main()
{
A a2;
cout << __LINE__ <<":" << _scount << endl;
fun();
cout << __LINE__ << ":" << _scount << endl;
return 0;
}
但是对于全局变量很危险,都可以访问或者修改它,我们使用全局变量的特点是它的生命周期长,是整个程序,所以使用它,我们也想要这种效果,又安全,只能在类中设置私有的静态的成员变量
class A
{
public:
A() { ++_scount; }//默认构造函数
A(const A & t) { ++_scount; }//拷贝构造
~A() { --_scount; }//析构函数
private:
static int _scount;//通过静态变量来计算对象的个数
};
静态变量是存放在静态区的,生命周期是整个程序。因为初始化列表是给对象中成员变量定义的地方,对象定义在栈区,所以没有办法使用初始化列表,也不能给缺省值,因为缺省值就是给初始化列表使用的,所以我们只能使用全局的来初始化静态的私有的成员变量,这时候理解为规定可以突破类域的限定在类外初始化(静态成员变量,类里面生明,类外面定义)
成员变量:属于每个类对象的,存储在对象里面
静态成员变量:属于类,是每个类对象共享的,存储在静态区里面的
int A::_scount = 0;//这是规定的格式
但是我们要怎么访问到私有的静态的成员变量呢??肯定不能直接访问,又两种解决办法
1.使用共有成员函数
class A
{
public:
A() { ++_scount; }//默认构造函数
A(const A & t) { ++_scount; }//拷贝构造
~A() { --_scount; }//析构函数
int GetACount() { return _scount; }
private:
static int _scount;//通过静态变量来计算对象的个数
};
int A::_scount = 0;
我们需要通过对象去调用,大家看看这么写是不是不太舒服,而且有点乱,什么对象都可以调用,理解性不高,这是我们使用static的成员函数,直接使用类名去调用,因为使用静态的,成员函数就没有this指针了,所以可以使用类名去调用
2.使用友元函数
我们来看看下面几个问题:
- 静态成员函数可以调用非静态成员函数吗?
- 非静态成员函数可以调用类的静态成员函数吗?
大家应该可以很清楚的看到结果了吧,因为静态的是没有this指针,调用非静态就没有东西传给this指针了
- 静态成员函数不可以调用非静态成员函数
- 非静态成员函数可以调用类的静态成员函数
大家也可以借此机会回顾一下const修饰的对象,能不能调用其他普通函数,普通函数能不能调用const对象。多是一个道理,理解就好了
总结特性:
- 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
- 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
- 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
- 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
- 静态成员也是类的成员,受public、protected、private 访问限定符的限制
我们来做一题来看看这个static的作用,在做这个体之前,我要铺垫一个知识:
我们在在定义一个自定义类型的数组,数组有多大,就创建了几次对象赋给数组里面,我们来看效果:
大家来看一下这个题,我们刚好利用了静态的特性,和自定义数组
class Sum
{
public:
Sum()
{
_ret+=_i;
_i++;
}
static int sum()
{
return _ret;
}
private:
static int _i;
static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;
class Solution {
public:
int Sum_Solution(int n) {
Sum a[n];
return Sum::sum();
}
};
这个题目还有一种解法,等我讲到内部类的时候在详细介绍对于静态在类中的作用和使用大家应该知道了吧, 我们下篇在见