37.【C/C++ 静态数据成员和静态成员函数 (超详解)】

(一)、什么是静态函数?

在这里插入图片描述

c语言中static的语义

1.static变量

static变量:1).
局部a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。
b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
static变量:2).
全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它

2.static函数(也叫内部函数)

只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含堆,不要弄混。

(二)、静态数据成员

1.空间分配和释放

(2)静态数据成员不随对象的建立而分配空间,也不随对象的撤销而释放(一般数据成员是在对象建立时分配空间,在对象撤销时释放)。静态数据成员是在程序编译时被分配空间的,至程序结束时才释放空间

2.静态数据成员初始化

(3)静态数据成员可以初始化,但只能在类体外进行初始化
注意:静态数据成员不能用参数初始化表对其初始化

在类内初始化必须前面加一个const static int
在类内,只有常量静态数据才能在类内初始化

#include <iostream>
using namespace std;
class Student
{
public:
	const static int score=3;
	int age;
	int number;
	Student(int a, int nu) :age(a), number(nu) {}
	Student() {}
	void set()
	{
		cout << "请输入学生的年龄和学号" << endl;
		cin >> age >> number;
	}
	static void show()
	{
		cout << score<< endl;
	}
};
int main()
{
	Student::show();
	return 0;
}
效果展示:

在这里插入图片描述

如在定义Box类中这样定义构造函数是错误的:Box(inth,int w,int len):height(h){}

【初始化列表案列】
在这里插入图片描述
在这里插入图片描述
【静态数据成员不能再类内初始化案列】

在这里插入图片描述
【静态数据成员在类外初始化】

#include <iostream>
using namespace std;
class A
{
private:
 static int number;
public:
 A() {}
 A(int n)
 {
  number = n;
 }
 void show()
 {
  cout << "number的值为:" << number << endl;
 }
};
int A::number = 3;
int main()
{
 A a;
 a.show();
}

在这里插入图片描述

3.静态数据成员的访问

(4)静态数据成员可以通过对象名引用,也可以通过类名引用。

代码展示:
#include <iostream>
using namespace std;
class Student
{
public:
	const static int score = 3;
	int age;
	int number;
	Student(int a, int nu) :age(a), number(nu) {}
	Student() {}
	void set()
	{
		cout << "请输入学生的年龄和学号" << endl;
		cin >> age >> number;
	}
	static void show()
	{
		cout << score << endl;
	}
};
int main()
{
	Student s;
	cout << Student::score << endl;    //类名
	cout << s.score << endl;          //类对象
	Student::show();
	return 0;
}
效果展示:

在这里插入图片描述

(四)、静态成员函数的初始化

1.注意事项

(1)类的静态成员函数只能访问类的静态数据成员,而不能访问类中的普通函数成员(非静态数据成 员),因为普通数据成员只有类的对象存在时才有意义。(2)静态成员函数与类相联系,而不与类的对象相联系,所以,在类的外部调用类中的公有静态成员 函数,必须在其左面加上“类名::”,而不是通过对象名调用公有静态成员函数。在类的外 部不能调用类中的私有静态成员函数。

2.访问格式:

类名::静态成员函数

代码展示:
#include <iostream>
using namespace std;
class Student
{
public:
  int age;
 int number;
 Student(int a, int nu) :age(a), number(nu) {}
 Student() {}
  void set()
 {
  cout << "请输入学生的年龄和学号" << endl;
  cin >> age >> number;
 }
 static void show()
 {
  cout << "学生的年龄为:" << " " << "学号为:" << endl;
 }
};
int main()
{
 Student::show();
 return 0;
}
效果展示:

在这里插入图片描述
在这里插入图片描述
如有未解问题,可联系博主。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉士先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值