CPP学习之——静态成员变量(17.1)

一 概述

  • 从本章节开始我们将学习类中的一些特殊成员,这些成员分为三大种——变量、函数和指针
  • 本节我们将接触类的第一个特殊成员——静态成员变量或者或静态成员数据

二 静态成员变量与对象变量区分

  • 在此之前,我们学到的类的对象中的变量一般都是这个对象所专有的,它是该对象区别于其他对象的一个标志。不能为其他对象共享使用
  • 比如说:张三身高180CM,体重75KG,年龄21,性别:男,这些数据实例化了张三这个具体的对象,也是他区别于李四和其他人的标志。因此这些数据必须为张三这个对象专有化,否则所有的对象都会与他混淆不清
  • 但是另外我们也许会碰到这样的情况,就是需要统计某个类共有多少个对象,比如说一个班是一个类,每个学生是该班级的一个对象,我们除了要区别每个对象之外,还要统计该班共有多少个学生。显然对象中的成员变量是不能为我们做到这一点,因此我们就需要一种新的数据类型,它在本班的所有对象中都是可以被共享使用的,这就是静态成员变量

三 示例演示及结果输出

3.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<iostream>
using namespace std;
class A
{
private:
int it;
public:
static int total;
A(int num):it(num){total++;}
~A(){total--;}
int get(){return it;}
void set(int age){it=age;}
};
int A::total=0;
int main()
{
const int max=5;
A*a[max];
int i;
for(i=0;i<max;i++)
{
a[i]=new A(i);
}
for(i=0;i<max;i++)
{
cout<<"该类有"<<A::total<<"个对象"<<endl;
cout<<"正在删除第"<<a[i]->get()+1<<"个对象"<<endl;
delete a[i];
}
return 0;
}

3.2 输出结果

1
2
3
4
5
6
7
8
9
10
该类有5个对象
正在删除第1个对象
该类有4个对象
正在删除第2个对象
该类有3个对象
正在删除第3个对象
该类有2个对象
正在删除第4个对象
该类有1个对象
正在删除第5个对象

四 示例演示及结果输出二

4.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
using namespace std;
class A
{
public:
int it;
public:
static int total;
A(int num):it(num){total++;}
~A(){total--;}
int get(){return it;}
void set(int age){it=age;}
};
int A::total=0;
int main()
{
A a(1),b(2),c(3);
cout<<"a.total:"<<a.total<<"\t"<<"b.total:"<<b.total<<"\t"<<"c.total:"<<c.total<<endl;
cout<<"a.it:"<<a.it<<"\t\t"<<"b.it:"<<b.it<<"\t\t"<<"c.it:"<<c.it<<endl;
return 0;
}

4.2 输出结果

1
2
a.total:3	b.total:3	c.total:3
a.it:1 b.it:2 c.it:3

五 示例演示及结果三

5.1 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
using namespace std;
class A
{
public:
int it;
public:
static int total;
A(int num):it(num){total++;}
~A(){total--;}
int get(){return it;}
void set(int age){it=age;}
};
int A::total=0;
void show()
{
cout<<A::total<<endl;
}
int main()
{
for(int i=0;i<5;i++)
{
A::total++;
show();
}
return 0;
}

5.2 输出结果

1
2
3
4
5
1
2
3
4
5

5.3 说明

  • 该例没有创建一个对象,但是你却可以通过类名和限定符访问静态变量total并且对其进行自加操作,这说明静态变量在没有对象之前就存在

六 总结

  • 第一:静态成员变量是属于整个类的全局变量,它不但属于某个对象,普通成员变量是属于类中对象的变量,它不能被所有对象共享
  • 第二:静态成员变量必须在全局进行定义,而成员变量由于是属于该类某个对象的,而不是属于整个类的,因此不用再全局进行定义
  • 第三:在使用静态成员变量时,可以不限定为某个具体的对象,只与类连用即可。如:A::total.而不用:A a;a.total
  • 第四:静态成员在没有对象之前就存在