c++ 学习之 静态成员变量和静态成员函数

文章目录

  • 前言
  • 正文
    • 静态成员变量
      • 初始化操作
      • 如何理解共享一份数据
      • 访问权限
    • 静态成员函数
      • 访问方式
      • 静态成员函数只能访问静态成员变量
      • 访问权限

前言

静态成员分为
1)静态成员变量

  • 所有对象共享一份数据
  • 在编译阶段分配空间
  • 类内声明,类外初始化
    2)静态成员函数
  • 所有对象共享一个函数
  • 静态成员函数只能访问静态成员变量

正文

静态成员变量

初始化操作

  • 静态变量要进行初始化操作,不然使用的时候会报错
    我们来看看下面的代码:
#define CRT_SECURE_NO_WARNINGS
#include
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 的时候由于它没有被赋初值,所以会报错
c++ 学习之 静态成员变量和静态成员函数_第1张图片
那怎么解决这个问题呢?
可以在类内初始化吗?
答案是不可以
c++ 学习之 静态成员变量和静态成员函数_第2张图片
那究竟该如何初始化呢
我们要在类外初始化
c++ 学习之 静态成员变量和静态成员函数_第3张图片
这样就解决问题了

如何理解共享一份数据

看完下面这个代码和运行结果你就会了解了

#define CRT_SECURE_NO_WARNINGS
#include
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();
}

c++ 学习之 静态成员变量和静态成员函数_第4张图片
静态成员变量的访问方式有两种

#define CRT_SECURE_NO_WARNINGS
#include
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 属性的,那么类外无法访问
c++ 学习之 静态成员变量和静态成员函数_第5张图片
在类外中 m_B 无法被访问

静态成员函数

访问方式

有两种访问方式

#define CRT_SECURE_NO_WARNINGS
#include
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 权限下的,外部也不能访问

你可能感兴趣的:(c++,c++,学习,算法)