静态成员
人们希望有一个或者多个数据成员为类的所有对象共同拥有,实现一个类的多个对象之间的数据共享,C++提出了静态成员的概念
如果有全局变量记录,那就破坏了类的封装性
静态数据成员
- 静态数据成员的定义与普通数据成员相似,但前面需加上关键字static
- 静态数据成员初始化特殊,需在类外单独初始化,不初始化默认为0
- 静态数据成员属于类而非某一个对象,所以可以用类名访问 (Score::a)
- 静态数据成员与静态变量一样,在编译时创建并初始化。它在类的任何对象被建立前就已经存在,因此共有的静态数据成员可以在对象定义之前被访问
声明初始化方法
class Person
{
public:
Person(){}
private:
static int sum;// 类内声明 权限也相应的有限制
};
int Person::sum = 10;//类外初始化
类名访问和对象访问
#include <iostream>
using namespace std;
class Person
{
public:
Person(){}
static int i;
private:
static int sum;//类内声明
};
int Person::sum = 10;//类外初始化
int Person::i = 10;
int main()
{
Person p1,p2;
cout << p1.i << endl;//10
cout << p2.i << endl;//10
cout << Person::i << endl;//10 静态数据成员属于类,可以用类访问
return 0;
}
静态成员函数
- 是该类所有对象共享的成员函数,而不属于类中的某个对象(可以使用类名调用)
- 它的存在专门为了处理静态数据成员(不能访问非静态成员,否则非法)
- 非静态成员函数有this指针,非静态成员函数无this指针(this指针是指明对象的,但是这是属于类的而非单一对象所有的)
- 编译系统将静态成员函数限定为内部链接,所以,与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性,这也是使用静态成员函数的另一个原因
- 访问非静态成员的方法
- 对象指针或指针引用
- 函数参数是类的引用或者指针,这样就可以在静态成员函数内部通过类的形参访问非静态成员了
静态成员函数访问非静态成员
#include <iostream>
using namespace std;
class Person
{
public:
Person(int age) {
this->m_age = age;
}
static int i;
static void get(const Person &p) { //用该类的引用或者值访问非静态成员
cout << p.m_age << endl;
}
void get() {
cout << sum << endl;
}
private:
static int sum;
int m_age;
};
int Person::sum = 10;//类外初始化
int main()
{
Person p(10);
p.get(p);
return 0;
}