文章目录
- 前言
- 正文
- 静态成员变量
- 初始化操作
- 如何理解共享一份数据
- 访问权限
- 静态成员函数
- 访问方式
- 静态成员函数只能访问静态成员变量
- 访问权限
前言
静态成员分为
1)静态成员变量
- 所有对象共享一份数据
- 在编译阶段分配空间
- 类内声明,类外初始化
2)静态成员函数 - 所有对象共享一个函数
- 静态成员函数只能访问静态成员变量
正文
静态成员变量
初始化操作
- 静态变量要进行初始化操作,不然使用的时候会报错
我们来看看下面的代码:
#define CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;class Person {
public:static int m_A;};void test()
{Person p;cout << p.m_A << endl;
}int main()
{test();
}
上面的代码会报错,因为调用 p.m_A 的时候由于它没有被赋初值,所以会报错
那怎么解决这个问题呢?
可以在类内初始化吗?
答案是不可以
那究竟该如何初始化呢
我们要在类外初始化
这样就解决问题了
如何理解共享一份数据
看完下面这个代码和运行结果你就会了解了
#define CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;// 静态成员分为
// 1)静态成员变量
// * 所有对象共享一份数据
// * 在编译阶段分配空间
// * 类内声明,类外初始化
// 2)静态成员函数
// * 所有对象共享一个函数
// * 静态成员函数只能访问静态成员变量class Person {
public:// 类内声明static int m_A ;};// 类外初始化操作
int Person::m_A = 100;void test()
{Person p;cout << p.m_A << endl;// 再实例化一个对象Person B;cout << B.m_A << endl;B.m_A = 200;cout << p.m_A << endl;cout << B.m_A << endl;
}int main()
{test();
}
静态成员变量的访问方式有两种
#define CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;// 静态成员分为
// 1)静态成员变量
// * 所有对象共享一份数据
// * 在编译阶段分配空间
// * 类内声明,类外初始化
// 2)静态成员函数
// * 所有对象共享一个函数
// * 静态成员函数只能访问静态成员变量class Person {
public:// 类内声明static int m_A ;};// 类外初始化操作
int Person::m_A = 100;void test()
{Person p;cout << p.m_A << endl;// 再实例化一个对象Person B;cout << B.m_A << endl;B.m_A = 200;cout << p.m_A << endl;cout << B.m_A << endl;
}void test02()
{// 静态成员变量 不属于某个对象上,所有对象都共享同一份对象// 因此静态成员变量有两种访问方式// 1.通过对象进行访问Person p;cout << p.m_A << endl;// 2.通过类名进行访问cout << Person::m_A << endl;
}int main()
{//test();test02();
}
访问权限
如果静态成员变量是在 private 属性的,那么类外无法访问
在类外中 m_B 无法被访问
静态成员函数
访问方式
有两种访问方式
#define CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;// 静态成员分为
// 1)静态成员变量
// * 所有对象共享一份数据
// * 在编译阶段分配空间
// * 类内声明,类外初始化
// 2)静态成员函数
// * 所有对象共享一个函数
// * 静态成员函数只能访问静态成员变量class Person
{
public:// 静态成员函数static void fun(){cout << " static void fun 函数 调用 " << endl;}
};// 有两种访问方式
void test01()
{// 1.通过对象访问Person p;p.fun();// 2.通过类名访问Person::fun();
}int main()
{test01();
}
静态成员函数只能访问静态成员变量
class Person
{
public:// 静态成员函数static void fun(){cout << " static void fun 函数 调用 " << endl;m_A = 100; //(正确) 静态成员函数可以访问 静态成员函数m_B = 100; // (错误) 静态成员函数不可以访问 非静态成员函数,无法区分是哪个实例的 m_B}static int m_A; //静态成员变量int m_B; // 非静态成员变量
};
int Person::m_A = 10;
访问权限
如果静态成员函数是 private 权限下的,外部也不能访问