1、静态成员概念
静态成员包括静态成员属性和静态成员函数,提出静态成员的目的是为了数据共享问题。
2、静态成员属性
1)静态成员属性定义
静态成员属性是类中所有对象共享的成员,而不是某个对象的成员,就是说明静态数据成员的存储空间不是放在每一个对象中,而是放在类公共区【全局变量区】,所以有时将静态成员属性称为类变量。 【只要类存在,静态成员属性就可以使用(务必注意这一点)】
回顾五大区知识:
堆区(malloc和new申请的空间) | 栈区(局部变量,类中的非静态成员属性) | |
---|---|---|
全局变量区(全局变量、静态局部变量、类中静态成员属性) | 常量区(常量) | 程序代码区(函数、类中成员函数) |
2)静态成员属性基本结构
【类内显示声明,类外定义】
类内声明:static 数据类型 变量名;
类外定义:数据类型 类名::变量名 = 初值;
3)静态成员属性的特点
(1)各个对象共享静态成员属性;
(2)存储区域由栈区/堆区变为全局变量区;
(3)对静态成员属性的操作和一般数据成员一样,如果将静态成员属性定义为私有,则不能由外界访问(不能被类外访问)。
4)静态成员属性访问方式
(1)通过类进行访问;
类名::静态成员属性名 = 值;
(2)通过类实例化的对象进行访问
对象名.静态成员属性名 = 值;
5)程序实例
实例1:
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
static int data; //静态成员属性--类内显示声明
};
int Person::data = 10; //静态成员属性--类外显示定义
int main()
{
Person::data = 20; //通过类进行访问
Person a, b, c; //创建三个对象
cout << "--------------------------------" << endl;
cout << "a.data的值:" << a.data << endl;
cout << "b.data的值:" << b.data << endl;
cout << "c.data的值:" << c.data << endl;
b.data = 66; //通过b对象来修改data的值
cout << "--------------------------------" << endl;
cout << "a.data的值:" << a.data << endl;
cout << "b.data的值:" << b.data << endl;
cout << "c.data的值:" << c.data << endl;
cout << "--------------------------------" << endl;
return 0;
}
运行结果:
--------------------------------
a.data的值:20
b.data的值:20
c.data的值:20
--------------------------------
a.data的值:66
b.data的值:66
c.data的值:66
--------------------------------
结果解释:通过运行结果可以看出,a,b,c三个对象共同访问该data的值 。
实例2:
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
static int data; //静态成员属性--类内显示声明
};
int Person::data = 10; //静态成员属性--类外显示定义
int main()
{
cout << "该类的大小为:" << sizeof(class Person) << endl;
return 0;
}
运行结果:
该类的大小为:1
结果解释:静态成员属性被编译器存放在全局变量区,它是类中的成员的,但是不影响类的大小。因此,在上面这个程序的实例中,sizeof求这个类的大小,相当于求一个空类的大小。【空类大小只有一字节(内存地址)】
3、静态成员函数
1)静态成员函数与静态成员属性类似,也属于类。【主要类存在,静态成员函数就可以使用(务必注意这一点)】。静态成员函数的声明需要使用static关键字来进行修饰。
2)静态成员函数基本结构
static 函数类型 函数名(参数列表/void)
3)静态成员函数调用方式
(1)通过类名进行相关调用。
类名::静态成员函数名(参数列表)
(2)通过对象进行调用。
对象名.静态成员函数名(参数列表)
4)程序实例
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
//静态成员属性
static int data;
//静态成员函数
static void function(void)
{
cout << "这是静态成员函数!!!" << endl;
data = 20; //在静态成员函数中修改静态成员属性的值
}
};
int Person::data = 10; //初始化该静态成员属性的值
int main()
{
cout << "静态成员属性的初始化值:" << Person::data << endl;
Person::data = 30; //通过类来修改静态成员属性的值
cout << "通过类修改后静态成员属性的值:" << Person::data << endl;
cout << "-----------------------------------" << endl;
cout << "通过类名调用静态成员函数!!!" << endl;
Person::function();
cout << "通过静态成员函数来修改静态成员属性的值:" << Person::data << endl;
cout << "-----------------------------------" << endl;
Person a;
cout << "通过对象调用静态成员函数!!!" << endl;
a.function();
cout << "a.data的值:" << a.data << endl;
return 0;
}
运行结果:
静态成员属性的初始化值:10
通过类修改后静态成员属性的值:30
-----------------------------------
通过类名调用静态成员函数!!!
这是静态成员函数!!!
通过静态成员函数来修改静态成员属性的值:20
-----------------------------------
通过对象调用静态成员函数!!!
这是静态成员函数!!!
a.data的值:20
【注意:静态成员函数可以直接访问静态成员属性,不能直接访问类中的非静态成员属性,因为非静态成员属性只有对象存在时才有意义。】