目录
1、静态成员【static修饰的成员】
1.1、静态成员概述
在类定义中,它的成员(成员变量、成员方法),这些成员使用关键字static修饰,称为静态成员。不管这个类创建了多少个对象,静态成员只有一份拷贝,这个拷贝被所有属于这个类的对象共享。
注意:普通成员是每一个类中独享的,而static修饰的成员是共享的。
静态成员属于类,而不是对象。
1.2、static修饰静态成员变量
静态变量,是在编译阶段就分配空间,对象还没有创建时,就已经分配空间。
静态成员变量必须在类中声明,在类外定义。
静态成员变量为什么要在类外定义呢?
这是因为编译阶段不会为类开辟内存空间,只有当给类进行实例化对象的时候,才会根据类的大小开辟空间。这时候如果静态变量定义在类里面是无法开辟空间的, 而静态变量在编译阶段就比需要有空间,那这个时候就必须在类外定义。
代码示例:
class Data {
public:
int num; //普通成员变量
static int data;//静态成员变量声明
};
//类外定义静态成员变量
int Data::data = 100;
void Init() {
//data属于静态成员变量 属于类 可以通过作用域直接访问
cout << Data::data << endl;
Data::data = 200;
cout << Data::data << endl;
//data静态变量 是所有对象共享的,可以通过对象名访问
Data ob1;
cout << ob1.data << endl;
Data ob2;
cout << ob2.data << endl;
}
int main() {
Init();
}
运行结果:
注意:普通成员不能通过类名称访问。
1.3、static修饰静态成员函数
上述案例data静态成员变量是public修饰的,此时可以通过类作用域访问,和对象名直接访问,此时如果将data静态成员变量用private修饰,此时就不可以通过类作用域直接访问。
此时发现静态成员变量被private修饰后,既不能通过类作用域直接访问,也不能通过get()函数直接调用,这个时候难道没有实例化对象就不能使用data了吗?
这时候就可以通过静态成员函数,去访问静态成员变量,因为静态成员函数也属于类,不属于对象。
class Data {
private:
int num; //普通成员变量
static int data;//静态成员变量声明
public:
//普通函数必须通过对象调用来访问
static int getData(void) {
return data;
}
};
//类外定义静态成员变量
int Data::data = 100;
void Init() {
//1、通过类名称直接访问
cout << Data::getData() << endl;
//2、通过对象名访问
Data ob;
cout << ob.getData() << endl;
}
int main() {
Init();
}
运行结果:
注意:
1、静态成员函数目的 操作静态成员数据。
2、静态 成员函数不能访问非静态成员数据。
3、普通成员函数可以操作 静态成员数据和非静态成员数据。
2、const修饰静态成员属性
如果一个类的成员,既要实现共享【static】,又要实现不可改变【const】,那就用static const修饰。
3、静态成员案例
案例1:静态成员统计类实例化对象的个数
#include<iostream>
using namespace std;
class Data {
public:
Data() {
cout << "无参构造" << endl;
count++;
}
Data(const Data &ob) {
cout << "构造拷贝函数" << endl;
count++;
}
~Data() {
cout << "析构函数" << endl;
count--;
}
static int count;
};
int Data::count = 0;
void Init() {
Data ob1;
Data ob2;
{
Data ob3;
cout << "对象的个数为:" << Data::count << endl;
}
cout << "对象的个数为:" << Data::count << endl;
}
int main() {
Init();
return 0;
}
运行结果: