文章目录
- 前言
- 正文
- 静态成员变量
- 初始化操作
- 如何理解共享一份数据
- 访问权限
- 静态成员函数
- 访问方式
- 静态成员函数只能访问静态成员变量
- 访问权限
前言
静态成员分为
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 权限下的,外部也不能访问